如何从现有数据创建数组
本节介绍切片
和索引
、np.vstack()
、np.hstack()
、np.hsplit()
、view()
、copy()
可以轻松地使用从现有数组的一部分创建新数组。
假设你有一个数组:
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
通过指定要切片数组的位置,可以随时从数组的某个部分创建新数组。
>>> arr1 = a[3:8]
>>> arr1
array([4, 5, 6, 7, 8])
在这里,您从索引位置3到索引位置8获取了数组的一部分。
还可以垂直和水平堆叠两个现有阵列。假设有两个数组,a1
和a2
:
>>> a1 = np.array([[1, 1],
... [2, 2]])
>>> a2 = np.array([[3, 3],
... [4, 4]])
可以使用vstack
垂直堆叠它们:
>>> np.vstack((a1, a2))
array([[1, 1],
[2, 2],
[3, 3],
[4, 4]])
或用hstack
水平堆叠:
>>> np.hstack((a1, a2))
array([[1, 1, 3, 3],
[2, 2, 4, 4]])
可以使用hsplit
将一个数组拆分为几个较小的数组。您可以指定要返回的形状相同的数组的数目,也可以指定在哪些列之后进行切分。
假设你有一个数组:
>>> x = np.arange(1, 25).reshape(2, 12)
>>> x
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]])
如果要将此数组拆分为三个形状相同的数组,请运行:
>>> np.hsplit(x, 3)
[array([[1, 2, 3, 4],
[13, 14, 15, 16]]), array([[ 5, 6, 7, 8],
[17, 18, 19, 20]]), array([[ 9, 10, 11, 12],
[21, 22, 23, 24]])]
如果要在第三列和第四列之后拆分数组,可以运行:
np.hsplit(x, (3, 4))
[array([[1, 2, 3],
[13, 14, 15]]), array([[ 4],
[16]]), array([[ 5, 6, 7, 8, 9, 10, 11, 12],
[17, 18, 19, 20, 21, 22, 23, 24]])]
stacking and splitting 数组更多参考 .
可以使用view
方法创建一个新的数组对象,该对象查看的数据与原始数组相同(浅层副本)
view
是一个重要的概念!NumPy函数以及索引和切片等操作将尽可能返回视图。这节省了内存,而且速度更快(不需要复制数据)。不过,要注意这一点很重要—在视图中修改数据也会修改原始数组!
假设您创建了这个数组:
>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
现在我们通过切片a
来创建数组b1
,并修改b1
的第一个元素。这也将修改a
中相应的元素!
>>> b1 = a[0, :]
>>> b1
array([1, 2, 3, 4])
>>> b1[0] = 99
>>> b1
array([99, 2, 3, 4])
>>> a
array([[99, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
使用copy
方法将生成数组及其数据的完整副本(深度副本)。要在array上使用此功能,可以运行:
>>> b2 = a.copy()
NumPy入门系列教程:
如何将一维array转换为二维array(如何向数组添加新轴)