按关键词阅读:
展开NumPy数组有时 , 当你有多维数组并希望将其折叠为一维数组时 , 可以使用 flatten()方法或ravel()方法:
a = np.ones((2,2))b = a.flatten()c = a.ravel()print('Original shape :', a.shape)print('Array :','\n', a)print('Shape after flatten :',b.shape)print('Array :','\n', b)print('Shape after ravel :',c.shape)print('Array :','\n', c)
Original shape : (2, 2)Array :[[1. 1.] [1. 1.]]Shape after flatten : (4,)Array :[1. 1. 1. 1.]Shape after ravel : (4,)Array :[1. 1. 1. 1.]
但是flatten() 和ravel()之间的一个重要区别是前者返回原始数组的副本 , 而后者返回对原始数组的引用 。 这意味着对ravel()返回的数组所做的任何更改也将反映在原始数组中 , 而flatten()则不会这样 。
b[0] = 0print(a)
[[1. 1.] [1. 1.]]
所做的更改没有反映在原始数组中 。
c[0] = 0print(a)
[[0. 1.] [1. 1.]]
但在这里 , 更改后的值也反映在原始ndarray中 。
这里发生的事情是flatten()创建了ndarray的深层副本 , 而ravel()创建了ndarray的浅层副本 。
深层副本意味着在内存中创建了一个全新的ndarray , flatten()返回的ndarray对象现在指向这个内存位置 。 因此 , 此处所做的任何更改都不会反映在原始ndarray中 。
另一方面 , 浅拷贝返回对原始内存位置的引用 。 这意味着ravel()返回的对象指向与原始ndarray对象相同的内存位置 。 因此 , 毫无疑问 , 对该ndarray所做的任何更改也将反映在原始ndarray中 。
文章插图
NumPy数组的转置NumPy的另一个非常有趣的重塑方法是transpose()方法 。 它接受输入数组并用列值交换行 , 用行值交换列值:
a = np.array([[1,2,3],[4,5,6]])b = np.transpose(a)print('Original','\n','Shape',a.shape,'\n',a)print('Expand along columns:','\n','Shape',b.shape,'\n',b)
OriginalShape (2, 3)[[1 2 3] [4 5 6]]Expand along columns:Shape (3, 2)[[1 4] [2 5] [3 6]]
在转置一个2x 3数组时 , 我们得到了一个3x2数组 。 转置在线性代数中有着重要的意义 。
扩展和压缩一个NumPy数组展开NumPy数组通过提供要展开的数组和轴 , 可以使用expand_dims()方法将新轴添加到数组中:
# 展开维度a = np.array([1,2,3])b = np.expand_dims(a,axis=0)c = np.expand_dims(a,axis=1)print('Original:','\n','Shape',a.shape,'\n',a)print('Expand along columns:','\n','Shape',b.shape,'\n',b)print('Expand along rows:','\n','Shape',c.shape,'\n',c)
Original:Shape (3,)[1 2 3]Expand along columns:Shape (1, 3)[[1 2 3]]Expand along rows:Shape (3, 1)[[1] [2] [3]]
压缩NumPy数组另一方面 , 如果希望减小数组的轴 , 请使用squeeze()方法 。 它将删除具有单个条目的轴 。 这意味着 , 如果创建了一个2 x 2 x 1矩阵 , 则squeze()将从矩阵中删除第三个维度:
# squeezea = np.array([[[1,2,3],[4,5,6]]])b = np.squeeze(a, axis=0)print('Original','\n','Shape',a.shape,'\n',a)print('Squeeze array:','\n','Shape',b.shape,'\n',b)
OriginalShape (1, 2, 3)[[[1 2 3][4 5 6]]]Squeeze array:Shape (2, 3)[[1 2 3] [4 5 6]]
但是 , 如果你已经有一个2×2的矩阵 , 在这种情况下使用squeeze()会给你一个错误:
# squeezea = np.array([[1,2,3],[4,5,6]])b = np.squeeze(a, axis=0)print('Original','\n','Shape',a.shape,'\n',a)print('Squeeze array:','\n','Shape',b.shape,'\n',b)
文章插图
NumPy数组的索引与切片到目前为止 , 我们已经看到了如何创建一个NumPy数组以及如何处理它的形状 。 在本节中 , 我们将看到如何使用索引和切片从数组中提取特定值 。
一维数组的切片切片意味着从一个索引检索元素到另一个索引 。 我们要做的就是像这样[start: end]
然而 , 你也可以定义步长 。 例如你可以将步长定义为2 , 这意味着让元素远离当前索引2个位置进行取值 。
将所有这些内容合并到一个索引中看起来像这样: [start?:end:step-size] 。
a = np.array([1,2,3,4,5,6])print(a[1:5:2])
[2 4]
注意 , 没有考虑最后一个元素 。 这是因为切片包括开始索引 , 但不包括结束索引 。
解决方法是将下一个更高的索引写入要检索的最终索引值:
a = np.array([1,2,3,4,5,6])print(a[1:6:2])
[2 4 6]
如果不指定起始索引或结束索引 , 则默认值分别为0或数组大小 。 默认情况下步长为1 。
a = np.array([1,2,3,4,5,6])print(a[:6:2])print(a[1::2])print(a[1:6:])
[1 3 5][2 4 6][2 3 4 5 6]
二维数组切片现在 , 二维数组有行和列 , 所以对二维数组进行切片会有点困难 。 但是一旦你理解了它 , 你就可以分割任何维度数组!
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2SG2020.html
标题:NumPy简洁教程( 三 )