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)
posted @ 2022-04-06 13:34  凯旋.Lau  阅读(112)  评论(0编辑  收藏  举报