numpy教程05---ndarray的高级操作
欢迎关注公众号【Python开发实战】, 获取更多内容!
工具-numpy
numpy是使用Python进行数据科学的基础库。numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变换和随机数函数。
ndarray的迭代
导入numpy
import numpy as np
在ndarray的迭代与常规Python数组的迭代非常相似。但是需要住的是,多维ndarray的迭代是相对于第一个轴完成的。
c = np.arange(24).reshape(2, 3, 4)
c
输出:
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]]])
for m in c:
print('item:')
print(m)
输出:
item:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
item:
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
for i in range(len(c)): # 这里,len(c)等于c.shape[0]
print('item')
print(c[i])
输出:
item
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
item
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
如果想要迭代ndarray中的所有元素,需要对ndarray的flat属性进行迭代。
for i in c.flat:
print('item: ', i)
输出:
item: 0
item: 1
item: 2
item: 3
item: 4
item: 5
item: 6
item: 7
item: 8
item: 9
item: 10
item: 11
item: 12
item: 13
item: 14
item: 15
item: 16
item: 17
item: 18
item: 19
item: 20
item: 21
item: 22
item: 23
堆叠ndarray
将不同的ndarray堆叠在一起通常很有用。numpy提供了几个函数来实现堆叠。介绍堆叠函数之前,先创建几个ndarray。
q1 = np.full((3, 4), 1.0)
q1
输出:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
q2 = np.full((4, 4), 2.0)
q2
输出:
array([[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.]])
q3 = np.full((3, 4), 3.0)
q3
输出:
array([[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]])
vstack
vstack可以垂直堆叠ndarray,但是要满足需要堆叠的ndarray,除了垂直轴以外,即在水平轴上要具有相同的形状。
q4 = np.vstack((q1, q2, q3))
q4
输出:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]])
q4.shape
输出:
(10, 4)
hstack
hstack可以水平堆叠ndarray。但是要满足需要堆叠的ndarray在垂直轴上具有相同的形状。
q5 = np.hstack((q1, q3))
q5
输出:
array([[1., 1., 1., 1., 3., 3., 3., 3.],
[1., 1., 1., 1., 3., 3., 3., 3.],
[1., 1., 1., 1., 3., 3., 3., 3.]])
q5.shape
输出:
(3, 8)
try:
q6 = np.hstack((q1, q2, q3))
except ValueError as e:
print(e)
输出:
all the input array dimensions except for the concatenation axis must match exactly
concatenate
concatenate可以沿给定的现有轴进行堆叠, 故vstack相当于调用axis=0的concatenate, hstack相当于调用axis=1的concatenate。
q7 = np.concatenate((q1, q2, q3), axis=0) # 相当于vstack
q7
输出:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]])
q7.shape
输出:
(10, 4)
q8 = np.concatenate((q1, q3), axis=1) # 相当于hstack
q8
输出:
array([[1., 1., 1., 1., 3., 3., 3., 3.],
[1., 1., 1., 1., 3., 3., 3., 3.],
[1., 1., 1., 1., 3., 3., 3., 3.]])
q8.shape
输出:
(3, 8)
stack
stack是沿着新轴进行堆叠,因此需要堆叠的ndarray必需具有相同的shape.
q9 = np.stack((q1, q3))
q9
输出:
array([[[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]],
[[3., 3., 3., 3.],
[3., 3., 3., 3.],
[3., 3., 3., 3.]]])
q9.shape
输出:
(2, 3, 4)
try:
q10 = np.stack((q1, q2))
except ValueError as e:
print(e)
输出:
all input arrays must have the same shape
拆分ndarray
拆分ndarray与堆叠相反。
r = np.arange(24).reshape(6, 4)
r
输出:
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]])
vsplit
vsplit可以垂直拆分ndarray, 下面的例子是将r垂直分成三等份。
r1, r2, r3 = np.vsplit(r, 3)
r1
输出:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
r2
输出:
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
r3
输出:
array([[16, 17, 18, 19],
[20, 21, 22, 23]])
hsplit
hsplit可以水平拆分ndarray。
r4, r5 = np.hsplit(r, 2)
r4
输出:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17],
[20, 21]])
r5
输出:
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15],
[18, 19],
[22, 23]])
split
split可以沿给定的现有轴进行拆分,调用axis=0的split相当于调用vsplit,调用axis=1的split相当于调用hsplit。
r6, r7 = np.split(r, 2, axis=1)
r6
输出:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13],
[16, 17],
[20, 21]])
转置ndarray
transpose函数是在ndarray的数据上创建一个新的视图,并按照给定顺序对轴排列。
t = np.arange(24).reshape(4, 2, 3)
t
输出:
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]]])
现在创建一个ndarray,将轴0、1、2(深度、高度、宽度)重新排列为1、2、0(高度、宽度、深度)。
t1 = t.transpose((1, 2, 0))
t1
输出:
array([[[ 0, 6, 12, 18],
[ 1, 7, 13, 19],
[ 2, 8, 14, 20]],
[[ 3, 9, 15, 21],
[ 4, 10, 16, 22],
[ 5, 11, 17, 23]]])
t1.shape
输出:
(2, 3, 4)
默认情况下,transpose会翻转轴的顺序。
t2 = t.transpose() # 相当于t.transpose((2, 1, 0))
t2
输出:
array([[[ 0, 6, 12, 18],
[ 3, 9, 15, 21]],
[[ 1, 7, 13, 19],
[ 4, 10, 16, 22]],
[[ 2, 8, 14, 20],
[ 5, 11, 17, 23]]])
t2.shape
输出:
(3, 2, 4)
numpy提供了一个方便的swapaxes来交换两个轴, 例如,创建一个深度和高度交换的ndarray。
t3 = t.swapaxes(0, 1)
t3
输出:
array([[[ 0, 1, 2],
[ 6, 7, 8],
[12, 13, 14],
[18, 19, 20]],
[[ 3, 4, 5],
[ 9, 10, 11],
[15, 16, 17],
[21, 22, 23]]])
t3.shape
输出:
(2, 4, 3)