索引、切片
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