ndarray
NumPy的数组类被称作ndarray。通常被称作数组。一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组
ndarray创建
zeros函数:创建指定长度或者形状全零数组
ones函数:创建指定成都为1的全1数组
array函数:接受一个普通的python序列,并将其转换成ndarray。比如元组转成ndarry
tup=(1,2,3,4,5)
print(np.array(tup))
[1 2 3 4 5]
其他创建方式
arange函数:类似python的range函数,通过指定开始值、终值和步长来创建一个一维数组,注意:最终创建的数组不包含终值
linspace函数:通过指定开始值、终值和元素个数来创建一个一维数组,数组的数据元素符合等差数列,可以通过endpoint关键字指定是否包含终值,默认包含终值
logspace函数:和linspace函数类似,不过创建的是等比数列数组
使用随机数填充数组,即使用numpy.random中的random()函数来创建0-1之间的随机元素,数组包含的元素数量由参数决定
arr=np.random.rand(3,2,2) # arr=np.random.random((3,2,2))
print(arr)
[[[0.75101736 0.51982582]
[0.03710116 0.83794153]]
[[0.31257467 0.47469632]
[0.12006499 0.77459261]]
[[0.85460101 0.43774334]
[0.29275921 0.60596007]]]
ndarray修改形状
a.shape=(2,-1)修改原数组的形状
a.reshape(5,-1)修改复制后的数组形状
ndarray-数组拉伸
np.tile(A,rep)函数可以将数组A进行拉伸,沿着A的维度重复rep次。
A的维度等于rep的维度,直接在A的纬度上拉伸;
A的维度低于rep的维度,在A高维度上补1,然后做对应拉伸;
A的维度高于rep的维度 ,在rep的高维度上补1,然后做对应拉伸。(补充:补1相当于不拉伸);先参考官网的example
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2]]])
>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2)
array([[1, 2, 1, 2],
[3, 4, 3, 4]])
>>> np.tile(b, (2, 1))
array([[1, 2],
[3, 4],
[1, 2],
[3, 4]])
>>> c = np.array([1,2,3,4])
>>> np.tile(c,(4,1))
array([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]])
分析其中一个
#数组本身A shape(2,3)
array([[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]])
# req 拉伸(2,1,2)原来的shape高维度补1变为(1,2,3)然后做对应纬度拉伸(2*1,1*1,2*3)变为shape(2,1,6)
>>> np.tile(a, (2, 1, 2))
#拉伸结果:shape(2,1,6)
array([[[0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2]]])
ndarray聚合
聚合函数是对一组值(eg一个数组)进行操作,返回一个单一值作为结果的函数。如:meanValue=numpy.mean(arr)
两种方式计算矩阵标准差
arr=np.random.randint(1,9,(2,3))
print(np.sqrt(np.mean(np.power((arr-np.mean(arr)),2))))
print(np.std(arr))
2.1343747458109497
2.1343747458109497
ndarray花式索引 指的是利用整数数组进行索引的方式
两种方式获取0,3,5行0,2,3列数据
arr=np.arange(32).reshape(8,4)
print(arr)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
print(arr[np.ix_([0,3,5],[0,2,3])]) #(0,3,5)行的(0,2,3)列
print(arr[[0,3,5]].T[[0,2,3]].T)
[[ 0 2 3]
[12 14 15]
[20 22 23]]
[[ 0 2 3]
[12 14 15]
[20 22 23]]
print(arr[[0,3,5],[0,2,3]]) #(0,0),(3,2),(5,3)位置的数据
[ 0 14 23]
注意:花式索引生成一个新的数组,实现的是拷贝功能。不像切片(切片:新数组会影响原数组),花式索引生成的是新的数据对象。
numpy.where
where函数是三元表达式x if condition else y的矢量化版本
arr=[1,3,3,np.NaN,4],[1,np.NaN,3,3,4],[np.NaN,4,1,3,3],[1,3,3,np.NaN,4]
# condition=np.equal(arr,1)
condition=np.isnan(arr)
newArr=np.where(condition,0,arr)#NaN替换为0
print(newArr)
[[1. 3. 3. 0. 4.]
[1. 0. 3. 3. 4.]
[0. 4. 1. 3. 3.]
[1. 3. 3. 0. 4.]]
ndarray广播
广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
import numpy as np
arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([1, 2, 3]) #arr2.shape = (3,)
arr_sum = arr1 + arr2
print(arr_sum)
输入结果如下:
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
import numpy as np
arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([[1],[2],[3],[4]]) #arr2.shape = (4, 1)
arr_sum = arr1 + arr2
print(arr_sum)
输出结果如下:
[[1 1 1]
[3 3 3]
[5 5 5]
[7 7 7]]
参考:《利用python进行数据分析》 第十一章 广播 图片和广播的原则的描述都来自本书,详细参考:https://www.cnblogs.com/jiaxin359/p/9021726.html