Numpy - 创建数组副本的多维数组
Numpy - create a multidimensional array of a copy of an array
我想生成一个有序数组,然后将其乘以另一个数组:
[ [0,1,2,3,4,5] [0,1,2,3,4,5] [0,1,2,3,4,5] ... [0,1,2,3,4,5] ]
我可以用 nums = np.arange(0, 6)
生成第一个 [0,1,2,3,4,5] 但是如果我乘以列表中的一个数字它只会增加值 = [nums* 3] = [0,3,6,9,12,15]
.
我该怎么做?
您不能将 numpy 数组与标量相乘并期望与 python 列表(或字符串)与标量相乘相同的行为。
对于 numpy,乘法运算符将对所有数组元素广播乘法:
即
np.array([1,2,3]) * 2 == np.array([1*2, 2*2, 3*2) == np.array([2,4,6])
相反,您可以使用列表理解
np.array([np.arange(6) for _ in range(4)])
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
或者通过乘法生成列表的列表,然后转换为numpy数组并整形:
np.array([list(range(6))*4]).reshape(4,6)
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
或者,生成形状为 (1,6) 的数组并沿第一个轴重复:
np.repeat(np.arange(6).reshape(1,6), repeats=4, axis=0)
# produces the same output as the example outputs above.
使用numpy
方法(numpy.repeat
and numpy.expand_dims
):
np.repeat(np.expand_dims(np.arange(0,6), axis=0), repeats=5, axis=0)
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
或者更简单地说:
np.repeat([np.arange(0,6)],repeats=5, axis=0)
如果您尝试扩展预先存在的一维数组,第一种方法很有用。如果您尝试从头开始创建数组,则第二种方法更直接。
顺便说一句,为什么不简单地使用 np.array()
,如:
In [147]: nums = np.arange(6)
In [148]: nums
Out[148]: array([0, 1, 2, 3, 4, 5])
In [149]: [nums] * 5
Out[149]:
[array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5])]
In [150]: np.array([nums] * 5)
Out[150]:
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
在一行中:
In [151]: np.array([np.arange(6)] * 5)
Out[151]:
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
我想生成一个有序数组,然后将其乘以另一个数组:
[ [0,1,2,3,4,5] [0,1,2,3,4,5] [0,1,2,3,4,5] ... [0,1,2,3,4,5] ]
我可以用 nums = np.arange(0, 6)
生成第一个 [0,1,2,3,4,5] 但是如果我乘以列表中的一个数字它只会增加值 = [nums* 3] = [0,3,6,9,12,15]
.
我该怎么做?
您不能将 numpy 数组与标量相乘并期望与 python 列表(或字符串)与标量相乘相同的行为。
对于 numpy,乘法运算符将对所有数组元素广播乘法:
即
np.array([1,2,3]) * 2 == np.array([1*2, 2*2, 3*2) == np.array([2,4,6])
相反,您可以使用列表理解
np.array([np.arange(6) for _ in range(4)])
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
或者通过乘法生成列表的列表,然后转换为numpy数组并整形:
np.array([list(range(6))*4]).reshape(4,6)
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
或者,生成形状为 (1,6) 的数组并沿第一个轴重复:
np.repeat(np.arange(6).reshape(1,6), repeats=4, axis=0)
# produces the same output as the example outputs above.
使用numpy
方法(numpy.repeat
and numpy.expand_dims
):
np.repeat(np.expand_dims(np.arange(0,6), axis=0), repeats=5, axis=0)
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
或者更简单地说:
np.repeat([np.arange(0,6)],repeats=5, axis=0)
如果您尝试扩展预先存在的一维数组,第一种方法很有用。如果您尝试从头开始创建数组,则第二种方法更直接。
顺便说一句,为什么不简单地使用 np.array()
,如:
In [147]: nums = np.arange(6)
In [148]: nums
Out[148]: array([0, 1, 2, 3, 4, 5])
In [149]: [nums] * 5
Out[149]:
[array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5]),
array([0, 1, 2, 3, 4, 5])]
In [150]: np.array([nums] * 5)
Out[150]:
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])
在一行中:
In [151]: np.array([np.arange(6)] * 5)
Out[151]:
array([[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]])