arr = [1, 2, 3, 4]
,和m = 3
。我想用m
行构建一个矩阵,其中包含重复的该数组。示例的输出如下:[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]
我该如何做呢?我曾经尝试过
np.vstack((arr, arr, arr))
然而,据我理解,这仅在我有效地硬编码m
的情况下才起作用。
arr = [1, 2, 3, 4]
,和m = 3
。我想用m
行构建一个矩阵,其中包含重复的该数组。示例的输出如下:[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]
我该如何做呢?我曾经尝试过
np.vstack((arr, arr, arr))
然而,据我理解,这仅在我有效地硬编码m
的情况下才起作用。
在numpy中有许多选项:
The simplest is np.stack
, with the new axis set to 0:
result = np.stack((arr,) * m, axis=0)
This is a generalization of np.vstack
, which can accept a variable m
in the same way:
result = np.vstack((arr,) * m)
Since you are looking to expand the first dimension and not the second, you can use np.tile
:
result = np.tile(arr, [m, 1])
For this simple case, you can repeat the elements individually for the same result using np.repeat
. This is a bit hacky, but it works just as well:
result = np.repeat([arr], m, axis=0)
If arr
is already a numpy array, you can add the leading dimension more explicitly:
result = np.repeat(arr[None, :], m, axis=0)
A slightly more convoluted method, but which showcases what is going on under the hood better is using np.concatenate
:
np.concatenate(([arr],) * m, axis=0)
In the same spirit as concatenate
, you can use the constructor np.array
directly:
np.array([arr] * m)
An ugly method is to use muliplication (combined with broadcasting):
result = arr * np.ones((m, 1), dtype=np.int8)
Setting the dtype to a very small integer type pretty much ensures that the result will be promoted to the actual type of your array.
The previous methods copy the array multiple times to get the 2D data. But since the data is repeated, you don't actually need to copy it. Instead, you can make a view that creates a fake first dimension using broadcasting. Specifically, the np.broadcast_to
function will do exactly what you want:
result = np.broadcast_to(arr, [m, len(arr)])
There is a more general approach even than the previous to making views is np.lib.stride_tricks.as_strided
.
First, let's reiterate the warning from the documentation:
Warning
This function has to be used with extreme care, see notes.
Unless you know the byte-size of the dtype you plan on using ahead of time, it's a good idea to ensure that arr
is a numpy array to get the strides from it:
arr = np.asanyarray(arr)
result = np.lib.stride_tricks.as_strided(arr, shape=(m, arr.size), strides=(0,) + arr.strides)
result = result.copy()
如果您不进行扩展操作,将会有效地模拟对同一列表的多个引用的行为,其中修改任何元素都会更改同一列中的所有元素。
您可以使用:
import numpy as np
arr, m = [1,2,3,4], 3
np.vstack([arr]*m)
输出:
array([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]])
你可以做:
n = [1,2,3,4]
m = 3
i = 0;
array = []
while(i<m):
array.append(n)
i+=1
print(array)
=> [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
=> [[1,2,3,4],[1,2,3,4],[1,2,3,4]]
list
对象是按引用传递的,因此列表是指针的集合;尝试更改一个array[1][2] = 10
:[[1, 2, 10, 4], [1, 2, 10, 4], [1, 2, 10, 4]]
@Quang Hoang的答案可以解决这个问题,因为它不是一个列表,而是一个numpy.array
。 - ti7