通过沿第一轴复制/重复从2D阵列创建3D阵列

时间:2016-07-27 08:20:50

标签: python arrays numpy

假设我有一个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.]]])

我怎样才能得到它?

4 个答案:

答案 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]]]