假设我有一个n × m
数组,即:
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]])
我要生成一个3D数组k × n × m
,其中新轴中的所有数组都是相同的,即:相同的数组,但现在是3 × 3 × 3
。
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]],
[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]],
[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]]])
我怎样才能得到它?
答案 0 :(得分:3)
在None/np.newaxis
开头介绍一个新轴,然后用np.repeat
复制它。这应该适用于将任何n
dim数组扩展为n+1
dim数组。实施将是 -
np.repeat(arr[None,...],k,axis=0)
示例运行 -
In [143]: arr
Out[143]:
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]])
In [144]: np.repeat(arr[None,...],3,axis=0)
Out[144]:
array([[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]],
[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]],
[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]]])
答案 1 :(得分:0)
如果你有:
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
您可以使用列表推导来生成重复数组:
b = [a for x in range(3)]
然后(为了numpy):
c = array(b)
答案 2 :(得分:0)
一种可能性是使用默认广播来复制您的阵列:
a = np.arange(1, 10).reshape(3,3)
n = 3
b = np.ones((n, 3, 3)) * a
这会产生你想要的数组:
array([[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]],
[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]],
[[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.]]])
如果要沿另一个轴复制它,默认情况下不会起作用。在这种情况下,您需要明确尺寸以确保正确的广播。
答案 3 :(得分:0)
我认为这个答案正是Divakar的答案,但是对于初学者来说,语法可能会更容易理解(至少在我看来是这样):
a = np.array([[1,2,3],[4,5,6]])
a[np.newaxis,:,:].repeat(3,axis=0)
导致:
array([[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
我在以下地方了解了 np.newaxis :What is numpy.newaxis and when to use it.
有关 numpy.repeat 的信息,请点击此处:numpy.repeat
这是我需要的一个示例用法:
k = np.array([[[111,121,131,141,151],[211,221,231,241,251]],\
[[112,122,132,142,152],[212,222,232,242,252]],\
[[113,123,133,143,153],[213,223,233,243,253]]])
filter = np.array([[True,True,True,True,False],
[True,False,False,True,False]])
k[filter[None,...].repeat(3,axis=0)] = 0
print(k)
导致:
[[[ 0 0 0 0 151]
[ 0 221 231 0 251]]
[[ 0 0 0 0 152]
[ 0 222 232 0 252]]
[[ 0 0 0 0 153]
[ 0 223 233 0 253]]]