python数组计算cos_NumPy基础:数组和⽮量计算NumPy 基础:数组和⽮量计算
NumPy 的 ndarray : ⼀种多维数组对象
import numpy as np
data = np.array()
data.shape #对象的结构,如(2,3)
data.dtype #对象元素的数据类型
data.ndim #对象的维度
创建ndarray
data = [] #创建⼀个list对象
arr = np.array(data) #传递⼀个list对象创建ndarray对象
np.arrange(10) #对应python内置的range函数
数组创建函数
函数
说明
array
将输⼊数据(列表、元祖、数组或其他序列类型)转换为ndarray。
asarray
将输⼊转换为ndarray,如果输⼊本⾝就是⼀个ndarray就不进⾏复制。
arrange
类似于内置的range。
ones、ones_like
根据指定的形状和dtype创建⼀个全1数组。ones_like以另⼀个数组为参数。
zeros、zeros_like
同上
empty、empty_like
创建新数组,只分配内存空间但不填充任何值。
eye、identity
创建⼀个正⽅的NxN单位矩阵(对⾓线为1,其余为0)
ndarray的数据类型
arr2 = np.array([1, 2, 3], dtype=np.int32)
float_arr1 = arr1.astype(np.float64) #data.astype()显式转换数据类型
float_arr2 = arr2.astype(arr1.dtype)
调⽤astype⽆论如何都会常见⼀个新的数组(原始数组的⼀份拷贝),即使新dtype跟⽼dtype相同也是如此。
基本的索引和切⽚
⼀维数组跟Python列表的功能差不多,跟列表最重要的区别在于,数组切⽚是原始数组的视图,并⾮拷贝。如果要想得到的是ndarray切⽚的⼀个副本⽽⾮视图,就需要显式的进⾏复制操作,例如==arr[5:8].copy()==。
以下两种⽅式是等价的
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d[0][2]
arr2d[0, 2]
切⽚索引
ndarray的切⽚语法跟Python列表这样的⼀维对象差不多。⾼维度对象的花样更多,可以在⼀个或多个轴上进⾏切⽚,也可以跟整数索引混合使⽤。
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d
Out:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
arr2d[:2]
Out:
array([[1, 2, 3],
[4, 5, 6]])
arr2d[:2,1:]
Out:
array([[2, 3],
[5, 6]])
布尔型索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = randn(7,4) //使⽤numpy.random中的randn函数⽣成⼀些正态分布的随机数据。
datapython获取数组长度
Out:
array([[-0.29387507, 0.17205361, 0.66953008, 1.52117065],
[ 0.76090409, 0.971822 , -0.32016532, 0.8410247 ],
[-0.16898366, 0.18393705, -0.68519614, 1.22744236],
[ 0.50100988, -0.75611675, 0.18750586, -1.64240784],
[-0.3859573 , 0.53440464, -0.74281885, 0.83665929],
[-0.52089554, 0.65959834, -0.17651269, -1.58237464]])
names == 'Bob'
Out: array([ True, False, False, True, False, False, False], dtype=bool)
data[names == 'Bob']
Out:
array([[-0.29387507, 0.17205361, 0.66953008, 1.52117065],
[-0.16898366, 0.18393705, -0.68519614, 1.22744236]])
布尔型数组的长度必须跟被索引的轴长度⼀致。还可以跟切⽚、整数(或整数序列)混合使⽤:data[names == 'Bob',2:]
Out:
array([[ 0.66953008, 1.52117065],
[-0.68519614, 1.22744236]])
要选择“Bob”以外的其他值,既可以使⽤不等于号(!=),也可以通过负号(-)对条件进⾏否定:data[names != 'Bob']
data[-(names == 'Bob')]
如果需要对布尔条件进⾏组合使⽤,可以使⽤&(和)、|(或)之类的布尔算数运算符即可:
mask = (names == 'Bob') | (names == 'Will')
mask
Out: array([ True, False, True, True, True, False, False], dtype=bool)
data[mask]
Out:
array([[-0.29387507, 0.17205361, 0.66953008, 1.52117065],
[ 0.76090409, 0.971822 , -0.32016532, 0.8410247 ],
[-0.16898366, 0.18393705, -0.68519614, 1.22744236],
[ 0.50100988, -0.75611675, 0.18750586, -1.64240784]])
通过布尔型索引选取数组中的数据,总是创建数据的副本,即使返回⼀模⼀样的数组也是如此。==Python关键字and和or在布尔型数组中⽆效。==
可以对数组中的⼀些符合条件的数据进⾏重新赋值:
data[data < 0] = 0
Out:
array([[ 0. , 0.17205361, 0.66953008, 1.52117065],
[ 1.10443341, 1.38657273, 0. , 0.14266073],
[ 0.76090409, 0.971822 , 0. , 0.8410247 ],
[ 0. , 0.18393705, 0. , 1.22744236],
[ 0.50100988, 0. , 0.18750586, 0. ],
[ 0. , 0.53440464, 0. , 0.83665929],
[ 0. , 0.65959834, 0. , 0. ]])
花式索引
即利⽤整数数组进⾏索引。
为了以特定的书序选取⾏⼦集,只需传⼊⼀个⽤于指定顺序的整数列表或ndarray即可:arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
arr
Out:
array([[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.],
[ 4., 4., 4., 4.],
[ 5., 5., 5., 5.],
[ 6., 6., 6., 6.],
[ 7., 7., 7., 7.]])
arr[[4, 3, 0, 6]]
Out:
array([[ 4., 4., 4., 4.],
[ 3., 3., 3., 3.],
[ 0., 0., 0., 0.],
[ 6., 6., 6., 6.]])
⼀次传⼊多个索引数组返回的是⼀个以为数组,其中的元素对应各个索引元组:
arr = np.arange(32).reshape((8, 4))
arr
array([[ 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]])
arr[[1, 5, 7, 2], [0, 3, 1, 2]] #返回的是元素(1,0)、(5,3)、(7,1)和(2,2)。
Out: array([ 4, 23, 29, 10])
我们可以通过以下⽅式获取矩阵的⾏列⼦集:
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
Out:
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
还可以通过使⽤np.ix函数,它可以将两个⼀维整数数组转换为⼀个⽤于选取⽅形区域的所引器:
arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]
Out:
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
==花式索引总是将数据复制到新数组中。==
数组转置和轴对换
==转置是重塑的⼀种特殊形式,它返回的事源数据的视图(不会进⾏任何复制操作)==。数组不仅有transppose⽅法,还有⼀个特殊的T属性:
arr = np.arange(15).reshape((3, 5))
arr
Out:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。