Python 数据处理:NumPy库

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的博客
🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
🥭本文内容:Python 数据处理:NumPy库

在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray(它含有高一级维度上的所有数据)。因此,在2×2×3数组arr3d中:

import numpy as np
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], 
                  [[7, 8, 9], [10, 11, 12]]])
print(arr3d)
print(arr3d[0,1])

标量值和数组都可以被赋值给arr3d[0]

import numpy as np
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], 
                  [[7, 8, 9], [10, 11, 12]]])

old_values = arr3d[0].copy()

arr3d[0] = 42
print(arr3d)

print('\n' + '-'*20 + '\n')

arr3d[0] = old_values
print(arr3d)

多维数组也能被重塑:

import numpy as np
arr = np.arange(12)
print(arr.reshape((4, 3)).reshape((3, 4)))

作为参数的形状的其中一维可以是-1,它表示该维度的大小由数据本身推断而来:

import numpy as np
arr = np.arange(15)
print(arr.reshape((5,-1)))

reshape将一维数组转换为多维数组的运算过程相反的运算通常称为扁平化(flattening)或散开(raveling),对应的函数为flattenravel

import numpy as np
arr = np.arange(15).reshape((5, 3))
print(arr)
print(arr.flatten())
print(arr.ravel())

如果结果中的值与原始数组相同,ravel不会产生源数据的副本。flatten方法的行为类似于ravel,只不过它总是返回数据的副本:

import numpy as np
arr = np.arange(15).reshape((5, 3))
print(arr.flatten())

9.1 广播规则

  1. 如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补1。
  2. 如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另外一个数组的形状。
  3. 如果两个数组的形状在任何一个维度上都不匹配并且每一偶任何一个维度等于1,那么会引发异常。

import numpy as np
M = np.ones((2,3))
a = np.arange(3)
print(M.shape)
print(a.shape)

根据规则1,数组a的维度数更小,所以在其左边补1:

  • M.shape -> (2, 3)
  • a.shape -> (1, 3)

根据规则2,第一个维度不匹配,因此扩展这个维度以匹配数组:

  • M.shape -> (2, 3)
  • a.shape -> (2, 3)

这样两个数组的形状匹配了,他们最终的形状都是 (2, 3):

import numpy as np
M = np.ones((2,3))
a = np.arange(3)
print(M + a)

对于三维的情况,在三维中的任何一维上广播其实也就是将数据重塑为兼容的形状而已。下图说明了要在三维数组各维度上广播的形状需求。

于是就有了一个非常普遍的问题(尤其是在通用算法中),即专门为了广播而添加一个长度为1的新轴。虽然reshape是一个办法,但插入轴需要构造一个表示新形状的元组。这是一个很无聊的过程。因此,NumPy数组提供了一种通过索引机制插入轴的特殊语法。下面这段代码通过特殊的np.newaxis属性以及“全”切片来插入新轴:

import numpy as np
arr = np.zeros((4, 4))
print(arr)
print("\n----------------\n")
arr_3d = arr[:, np.newaxis, :]
print(arr_3d)
print(arr_3d.shape)

import numpy as np
arr_1d = np.random.normal(size=3)
print(arr_1d[:, np.newaxis])
print(arr_1d[np.newaxis, :])
print(arr_1d.reshape((1,-1)))

因此,如果我们有一个三维数组,并希望对轴2进行距平化,那么只需要编写下面这样的代码就可以了:

import numpy as np
arr = np.random.randn(3, 4, 5)
depth_means = arr.mean(2)
print(depth_means)
print(depth_means.shape)
demeaned = arr - depth_means[:, :, np.newaxis]
print(demeaned.mean(2))


9.2 通过广播设置数组的值

算术运算所遵循的广播原则同样也适用于通过索引机制设置数组值的操作。对于最简单的情况,我们可以这样做:

import numpy as np
arr = np.zeros((4, 3))
arr[:] = 5
print(arr)

但是,假设我们想要用一个一维数组来设置目标数组的各列,只要保证形状兼容就可以了:

import numpy as np
arr = np.zeros((4, 3))
col = np.array([1.28, -0.42, 0.44, 1.6])
print(col.shape)
arr[:] = col[:, np.newaxis]
print(arr)
arr[:2] = [[-1.27],[0.509]]
print(arr)
print(arr.flags)

未经允许不得转载:木盒主机 » Python 数据处理:NumPy库

赞 (0)

相关推荐

    暂无内容!