Numpy进阶要点总结
获取符合条件的索引
函数:where([condition])
eg. 获得数组[[ 1 2 3 4 5] [ 2 4 6 8 10] [ 3 6 9 12 15]]中大于5的元素的索引。
b=array1>5
index_gt5=np.where(b)
结果:
(array([1, 1, 1, 2, 2, 2, 2], dtype=int64), array([2, 3, 4, 1, 2, 3, 4], dtype=int64))
结果说明:
输出结果是二维数组中对应元素值为true的坐标,第一个array代表行,第二个array代表列。一一对应,组成(行,列)坐标对。
补充:函数:where([condition],x,y)
condition中为true的返回x, 为false 的返回y.
获得数组中最大最小值的索引
函数:np.argmax([array])
np.argmin([array])
元组(tuple)
这是新型编程语言才有的概念,C系列、Java语言中都没有。若某一变量/函数是元素(tuple)则可以返回多个变量,由多个变量同时接受,变量位置和该变量/函数的返回值位置对应。
例如,上述index_gt5是元组(tuple)类型。包含两个数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjmIueih-1598581756083)(C:\Users\38266\AppData\Roaming\Typora\typora-user-images\image-20200527174224687.png)]
使用如下代码可以得到,两个数组。第一个数组存入x,第二个数组存入y.
x,y=index_gt5
创建元组
t=()
若元组中只有一个元素,则需要加“,” 如:t(1,)
导入导出csv、保存加载numpy
导入数据:np.genfromtxt() 导入csv: np.savetxt()
针对numpy数据,保存一个ndarray 使用np.save() 保存为 .npy ; 保存多个ndarray ,使用np.savez() 保存为.npz。
加载使用np.load()
标量函数向量化
什么是标量函数?简单的说,就是传一个参数返回一个参数。
所谓向量化,就是把这个标量函数改装成,可以传一个数组返回一个数组,其中对每个元素的操作都和对应标量函数的的操作一致。
eg, 有一标量函数fun(x)
def fun(x):
if x%2==0:
return x**2
else:
return x
向量化后
fun_v=np.vectorize(fun,otypes=[float])
print(fun_v([1,2,3,4,5]))
结果:
[ 1. 4. 3. 16. 5.]
思考:依据函数向量化的思路,我们是否可以将np.max向量化求数组(dnarray)的行或列的最大值呢?
当然不可以,np.vectorize()向量化后对象对目标的操作是将目标的每一个元素单独取出操作,而我们要达到求行或列最大值的目的,需要对每一行元素取出进行操作。
由此,我们有了另一个函数np.apply_ along_ _axis().这个函数就可以对一条轴上元素整体取出进行操作,可以达到求行、列最大值的目的。
eg. 求 二维数组 array1 的每行最大值。
row_max=np.apply_along_axis(np.max,axis=1,arr=array1)
增加数组的维度
列的维度增加:x_col=x[:, np.newaxis]
行的维度增加:x_row=x[np.newaxis,: ]
Histogram函数和Bincount函数
Bincount函数
**用途1)**每个索引的次数np.bincount(x)
将一个索引数组称为bin数组,若x数组中最大的数为A,则bin数组的数量为A+1,索引为0 --> A,即 bin=[0, 1, 2, 3, ……,A]。np.bincout返回bin数组中每个元素在x中出现的次数。所以np.bincount返回值是一个长度为A的数组。
#我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7
x = np.array([0, 1, 1, 3, 2, 1, 7])
#索引0出现了1次,索引1出现了3次......索引5出现了0次......
np.bincount(x)
#因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])
#我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7
x = np.array([7, 6, 2, 1, 4])
#索引0出现了0次,索引1出现了1次......索引5出现了0次......
np.bincount(x)
#输出结果为:array([0, 1, 1, 0, 1, 0, 1, 1])
**用途2)**参数weight。
同样, bin=[0, 1, 2, 3, ……,A]。在x中找到与bin中元素(元素设为index)相同的,记录下索引号,在weight数组中将索引号对应的权重元素累加。
w = np.array([0.3, 0.5, 0.2, 0.7, 1., -0.6])
# 我们可以看到x中最大的数为4,因此bin的数量为5,那么它的索引值为0->4
x = np.array([2, 1, 3, 4, 4, 3])
# 索引0 -> 0
# 索引1 -> w[1] = 0.5
#索引2 -> w[0] = 0.3
#索引3 -> w[2] + w[5] = 0.2 - 0.6 = -0.4
#索引4 -> w[3] + w[4] = 0.7 + 1 = 1.7
np.bincount(x, weights=w)
# 因此,输出结果为:array([ 0. , 0.5, 0.3, -0.4, 1.7])
用途3) 参数minlength
指定bin数组的最小长度。如果指定的长度小于x的长度,则这个参数不发挥作用。
# 我们可以看到x中最大的数为3,因此bin的数量为4,那么它的索引值为0->3
x = np.array([3, 2, 1, 3, 1])
# 本来bin的数量为4,现在我们指定了参数为7,因此现在bin的数量为7,所以现在它的索引值为0->6
np.bincount(x, minlength=7)
# 因此,输出结果为:array([0, 2, 1, 2, 0, 0, 0])
# 我们可以看到x中最大的数为3,因此bin的数量为4,那么它的索引值为0->3
x = np.array([3, 2, 1, 3, 1])
# 本来bin的数量为4,现在我们指定了参数为1,那么它指定的数量小于原本的数量,因此这个参数失去了作用,索引值还是0->3
np.bincount(x, minlength=1)
# 因此,输出结果为:array([0, 2, 1, 2])
histogram函数
计算x元素在bin区间的个数
eg.
x=np.array([1,1,2,3,2,4,4,5,6,6,6])
count,bins=np.histogram(x,[0,2,4,6,8])
print(count)
print(bins)
结果:
[2 3 3 3]
因此,输出结果为:array([0, 2, 1, 2])
### histogram函数
计算x元素在bin区间的个数
eg.
```python
x=np.array([1,1,2,3,2,4,4,5,6,6,6])
count,bins=np.histogram(x,[0,2,4,6,8])
print(count)
print(bins)
结果:
[2 3 3 3]
[0 2 4 6 8]