12、 数组转置
arr = np.arange(12).reshape((4, 3))
arr
Out[114]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
arr.T
Out[115]:
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])
12.1、矩阵內积
np.dot(arr, arr.T)
Out[116]:
array([[ 5, 14, 23, 32],
[ 14, 50, 86, 122],
[ 23, 86, 149, 212],
[ 32, 122, 212, 302]])
12.2、transpose : 高维度的轴转置,直接指定轴
arr = np.arange(24).reshape((2, 3, 4))
arr.shape
Out[118]: (2, 3, 4)
arr.transpose((0,2,1)).shape# 轴已经被重新排序,第二个轴变为第三个,第三个轴变为第二个, 第一个轴没有变化。
Out[120]: (2, 4, 3)
13. 一元通用函数
对数据内的元素逐一进行计算转换的函数,例如:sqrt, exp, square函数等
arr = np.arange(8)
np.sqrt(arr)# 求平方
Out[122]:
array([0. , 1. , 1.41421356, 1.73205081, 2. ,
2.23606798, 2.44948974, 2.64575131])
np.exp(arr)# e的 x次幂
Out[123]:
array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03])
np.square(arr)# 求平方
Out[124]: array([ 0, 1, 4, 9, 16, 25, 36, 49])
注意,如果存在入参不符合运算符号,则会返回nan
arr = np.random.randn(8)
arr
Out[133]:
array([-2.05037713, 0.14020296, -0.23755503, -0.30179514, 0.71098618,
0.97552671, -0.53583424, 0.83127439])
np.sqrt(arr)
Out[134]:
array([ nan, 0.37443686, nan, nan, 0.84319996,
0.98768756, nan, 0.9117425 ])
14、二元通用函数
比如add或maximum则会接收两个数组并返回一个数组作为结果,因此称为二元通用函数:
x = np.random.randn(6)
y = np.random.randn(6)
x
Out[128]:
array([-0.21500853, 0.66749928, -0.20697387, -0.71304554, 0.37098523,
0.1700025 ])
y
Out[129]:
array([-0.56982788, 0.68271937, 0.34257971, -0.72677899, 2.02009784,
-0.29568308])
np.minimum(x, y)
Out[130]:
array([-0.56982788, 0.66749928, -0.20697387, -0.72677899, 0.37098523,
-0.29568308])
np.add(x, y)
Out[131]:
array([-0.7848364 , 1.35021865, 0.13560584, -1.43982453, 2.39108307,
-0.12568058])
一些常用的二元通用函数:add(), subtract(), multiply(), divide(), power(), minimum(), maximum(), mod(), copysign() 等
15、面向数组编程
使用NumPy数组可以使你**利用简单的数组表达式完成多种数据操作任务,而无须写些大量循环。这种利用数组表达式来替代显式循环的方法,称为向量化。**通常,向量化的数组操作会比纯Python的等价实现在速度上快一到两个数量级(甚至更多),这对所有种类的数值计算产生了最大的影响。广播机制,就是向量化计算的有效方式。
15.1、where使用
xarr = np.array([1, 2, 3, 4, 5])
yarr = np.array([-1, -2, -3, -4, -5])
cond = np.array([True, False, True, False, False])
np.where(cond, xarr, yarr)
Out[174]: array([ 1, -2, 3, -4, -5])
where 的第二和第三个参数也可以是常数:
arr = np.random.randn(4, 4)
arr
Out[176]:
array([[ 1.2961233 , -2.88646621, 0.93438555, -1.25265235],
[ 0.48880916, 0.42995708, -0.64266328, 0.78978925],
[ 0.45636547, -0.73146585, 1.4273524 , -0.35658024],
[-0.33206549, -0.43699776, -1.3090687 , -0.22809868]])
np.where(arr > 0, 2, 4)
Out[178]:
array([[2, 4, 2, 4],
[2, 2, 4, 2],
[2, 4, 2, 4],
[4, 4, 4, 4]])
也可以将标量和数组联合:
np.where(arr > 0, 2, arr)
Out[179]:
array([[ 2. , -2.88646621, 2. , -1.25265235],
[ 2. , 2. , -0.64266328, 2. ],
[ 2. , -0.73146585, 2. , -0.35658024],
[-0.33206549, -0.43699776, -1.3090687 , -0.22809868]])
16、数学统计方法
16.1、 生成正态分布随机数
np.random.randn(4, 4)
Out[181]:
array([[-0.43557002, 0.18513869, 1.38542625, 1.08208742],
[-0.95626917, -0.47786185, 1.13753443, -0.50758502],
[-0.57587564, 0.09479777, -1.21633601, 1.15994104],
[-1.18379534, -1.80556846, -0.86174233, -0.62384213]])
16.2、求均值,求和等基本函数
arr = np.random.randn(6, 4)
np.mean(arr)
Out[187]: 0.2709723012613589
np.mean(arr, axis=0)
Out[188]: array([ 0.89950363, 0.21092785, 0.02243588, -0.04897816])
np.mean(arr, axis=1)
Out[189]:
array([-0.03887685, 0.49932633, 0.19285844, 0.67418347, 0.20515993,
0.09318249])
np.sum(arr, axis=1)
Out[190]:
array([-0.1555074 , 1.99730531, 0.77143377, 2.69673388, 0.82063972,
0.37272995])
16.3、从0开始累积和,保留中间结果
arr = np.array([[1, 2, 3], [2, 3, 4]])
arr.cumsum()
Out[192]: array([ 1, 3, 6, 8, 11, 15])
arr.cumsum(axis=0)
Out[193]:
array([[1, 2, 3],
[3, 5, 7]])
16.4、从1开始累积积,保留中间结果
arr = np.array([[1, 2, 3], [2, 3, 4]])
arr.cumprod()
Out[194]: array([ 1, 2, 6, 12, 36, 144])
arr.cumprod(axis=1)
Out[195]:
array([[ 1, 2, 6],
[ 2, 6, 24]])
17、布尔值使用注意
布尔值会被强制为1(True)和0(False)。因此,sum通常可以用于计算布尔值数组中的True的个数:
arr = np.random.randn(20)
(arr > 0).sum()
Out[197]: 10
arr
Out[198]:
array([-0.06362464, -0.6100316 , 0.12361219, 0.25190379, -1.52586242,
-1.33745935, -0.22683688, -0.03459611, 0.6139537 , -1.64770753,
1.66887116, 0.26116986, 0.20411899, 0.83109152, 1.67663276,
-0.71277905, -0.20720236, 0.23696832, -0.44984138, 0.20837779])
18、对数组进行排序
arr = np.random.randn(6)
arr.sort()# 会改变数组本身的元素顺序
arr
Out[204]:
array([-1.00733061, -1.00571107, -0.19190603, 0.25129317, 1.24748051,
1.44873112])
np.sort(arr)# 本身顺序不变
Out[205]:
array([-1.00733061, -1.00571107, -0.19190603, 0.25129317, 1.24748051,
1.44873112])
按照某个轴排序
arr = np.random.randn(3, 4)
arr
Out[219]:
array([[ 0.99479473, 0.10430381, 0.02247815, -2.68770651],
[-0.85507877, -0.88179426, 0.79425161, 0.99193008],
[-1.58212775, -1.0224034 , -0.04208243, -0.43739719]])
np.sort(arr, axis=1)
Out[220]:
array([[-2.68770651, 0.02247815, 0.10430381, 0.99479473],
[-0.88179426, -0.85507877, 0.79425161, 0.99193008],
[-1.58212775, -1.0224034 , -0.43739719, -0.04208243]])
19、元素去重
ints = np.random.randint(low=0, high=8, size=10)
np.unique(ints)
Out[230]: array([2, 4, 5, 6, 7])
ints
Out[231]: array([2, 7, 5, 4, 2, 5, 2, 7, 5, 6])
20、 检查一个数组中的值是否在另外一个数组中
ints = np.random.randint(low=0, high=8, size=10)
ints
Out[233]: array([0, 1, 5, 5, 7, 6, 7, 4, 1, 5])
np.in1d([1, 8, 9], ints)
Out[235]: array([ True, False, False])
另外ndarray还存在如下的集合操作:
待续。。。