Ndarray元素操作

索引、切片

import numpy as np

arr = np.arange(6)
print(arr)

# 索引
print(arr[2])
 
# 切片 slice(start,stop,step)
arr_a = slice(0,2,1)
print('arr_a==',arr[arr_a])

'''
array[start:stop:step],用法:
- [1],返回该索引对应的元素
- [0:],提取该索引开始到最后一个元素
- [1:2],提取两个索引之间的项目(不包括第三个元素)
'''        
arr_b = arr[0:2:1]
print('arr_b==',arr_b)

# 多维数组
arr_c = np.arange(18)
arr_c.shape = (6,3)

# print(arr_c)
# 得到的还是一个数组
arr_d = arr_c[1]
print('arr_d==',arr_d,type(arr_d))

# 获取某个元素
arr_e = arr_c[1][0]
print('arr_d==',arr_e,type(arr_e))

arr_f = arr_c[1:]
print('arr_d==',arr_f,type(arr_f))

print('------- 切片中带省略号 --------')
# 省略号(...)
# 获取第一列元素
print(arr_c[...,0],'\n')

# 获取第一行元素
print(arr_c[0,...],'\n')

# 获取第二行及剩余所有元素
print(arr_c[1:,...],'\n')
复制代码

高级索引

整数数组索引

import numpy as np
arr = np.array([[1,2,3],[3,2,1],[8,9,0]])
print(arr,'\n')
print('获取0,2 1,0 2,1 3个元素',arr[[0,1,2],[2,0,1]],'\n')
复制代码
import numpy as np
arr = np.array([[1,2,3],[3,2,1],[8,9,0],[0,9,8]])
print(arr,'\n')
rows = np.array([[0,0],[1,2]])
cols = np.array([[1,2],[1,0]])
print(arr[rows,cols],'\n')
#1:3取的是行,:2取的是列,解是两者选出来的交集
print(arr[1:3,:2],'\n')
print('与上同理:\n',arr[1:3,[0,1]],'\n')
print('所有行和除第一列外所有列的交集\n',arr[...,1:])
复制代码

布尔索引

布尔索引通过布尔运算(如:比较运算)来获取符合指定条件的元素的数组.

arr = np.array([[1,2,3],[3,2,1],[8,9,0],[0,9,8]])
print(arr>3,'\n')
print(arr[arr>3],'\n')

arr = np.array([2,1,np.nan,3,np.nan]) # np.nan是float类型
#print(np.nan,type(np.nan))
print(arr)
print(arr[np.isnan(arr)]) # 找到是nan的元素
print(arr[~np.isnan(arr)]) # ‘~’作用是过滤nan元素,生成新的数组

复制代码

迭代

numpy.nditer的基本使用

它是一个有效的多维迭代器对象,可以用在数组上进行迭代(这里的迭代就是按顺序查看数组中的元素)。数组的每一个元素可使用Python的标准Iterator接口来访问。

import numpy as np
arr = np.arange(12)
arr = arr.reshape(3,4)
print(arr)
for i in np.nditer(arr):
    print(i,end=', ')

print("\n")

print(arr.T)
print("\n")
for i in np.nditer(arr.T):
    print(i,end=', ') # 遍历的顺序不变,arr.T没有改变内存中存储方式,只是看到arr转置后的效果

print('\n')
b = arr.T
print(b)
    
复制代码

控制遍历顺序

# 转置后得到新的数组对象,内存中真实的存储顺序。如展示效果所示。 order = 'C' 行优先
arr_c = arr.T.copy(order='C')
print(arr_c)

for item in np.nditer(arr_c):
    print(item,end=',')
print("")
复制代码
# 列优先
arr_c = b.copy(order='F')
print(arr_c)
# 列优先,读取元素顺序从第一列开始
for i in np.nditer(arr_c):
    print(i,end=',')
复制代码
import numpy as np
arr = np.arange(12)
arr = arr.reshape(3,4)
print(arr,'\n')

# order='C' OR order='F'
for i in np.nditer(arr,order='C'):
    print(i,end=',')
复制代码

外部循环

import numpy as np
arr = np.arange(12)
arr = arr.reshape(3,4)
print(arr,'\n')

# flags = c_index/f_index/external_loop/
for i in np.nditer(arr,flags=["external_loop"],order='F'):
    print(i,end=', ')    
print('\n')
复制代码

广播迭代

如果两个数组是可广播的,nditer组合对象能够同时迭代它们

import numpy as np
arr_a = np.arange(12).reshape(3,4) # 可以尝试与arr_b不匹配的情况会发生什么

arr_b = np.arange(1,5) 
for x,y in np.nditer([arr_a,arr_b]):
    print("%d:%d"%(x,y),end=', ')
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享