【问题标题】:Appending to a multidimensional array Python追加到多维数组 Python
【发布时间】:2021-11-02 04:39:10
【问题描述】:

我正在过滤数组ab 以获得相同的值,然后我想将它们附加到一个新数组difference 但是我得到了错误:ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 0 and the array at index 1 has size 2。我该如何解决这个问题?

import numpy as np
a = np.array([[0,12],[1,40],[0,55],[1,23],[0,123.5],[1,4]])
b = np.array([[0,3],[1,10],[0,55],[1,34],[1,122],[0,123]])
difference= np.array([[]])


for i in a:
    for j in b:
        if np.allclose(i, j, atol=0.5):
            difference = np.concatenate((difference,[i]))

预期输出:

[[ 0. 55.],[  0.  123.5]]

【问题讨论】:

  • 循环中的重复连接既难做对,又效率低下。这里需要了解数组维度。没有猜测或近似的余地。
  • 你为什么不在一个列表中收集差异?

标签: python arrays numpy multidimensional-array append


【解决方案1】:
In [22]: a = np.array([[0,12],[1,40],[0,55],[1,23],[0,123.5],[1,4]])
    ...: b = np.array([[0,3],[1,10],[0,55],[1,34],[1,122],[0,123]])

使用简单的列表理解:

In [23]: [i for i in a for j in b if np.allclose(i,j,atol=0.5)]
Out[23]: [array([ 0., 55.]), array([  0. , 123.5])]

但至于你的连接。查看数组的形状:

In [24]: np.array([[]]).shape
Out[24]: (1, 0)
In [25]: np.array([i]).shape
Out[25]: (1, 1)

只能在轴 1 上连接;默认为 0,给你错误。就像评论中写的一样,您必须了解数组形状才能使用concatenate

In [26]: difference= np.array([[]])
    ...: for i in a:
    ...:     for j in b:
    ...:         if np.allclose(i, j, atol=0.5):
    ...:             difference = np.concatenate((difference,[i]), axis=1)
    ...: 
In [27]: difference
Out[27]: array([[  0. ,  55. ,   0. , 123.5]])

矢量化

全数组方法:

broadcase ab,产生 (5,5,2) 接近度数组:

In [37]: np.isclose(a[:,None,:],b[None,:,:], atol=0.5)
Out[37]: 
array([[[ True, False],
        [False, False],
        [ True, False],
        [False, False],
        [False, False],
        [ True, False]],

       [[False, False],
        [ True, False],
        [False, False],
        [ True, False],
        [ True, False],
        [False, False]],

       [[ True, False],
        [False, False],
        [ True,  True],
        [False, False],
        [False, False],
        [ True, False]],

       [[False, False],
        [ True, False],
        [False, False],
        [ True, False],
        [ True, False],
        [False, False]],

       [[ True, False],
        [False, False],
        [ True, False],
        [False, False],
        [False, False],
        [ True,  True]],

       [[False, False],
        [ True, False],
        [False, False],
        [ True, False],
        [ True, False],
        [False, False]]])

找出两列都为真的地方,以及至少一个“行”在哪里:

In [38]: _.all(axis=2)
Out[38]: 
array([[False, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False, False,  True, False, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False, False,  True],
       [False, False, False, False, False, False]])
In [39]: _.any(axis=1)
Out[39]: array([False, False,  True, False,  True, False])
In [40]: a[_]
Out[40]: 
array([[  0. ,  55. ],
       [  0. , 123.5]])

【讨论】:

    【解决方案2】:

    np.array([[]]) 形状为 (1, 0)。要使其工作,它应该是 (0, 2):

    difference= np.zeros((0, *a.shape[1:]))
    

    【讨论】:

      【解决方案3】:

      问题是您试图连接元素大小为 0 的数组

      difference= np.array([[]])  # Specifically [ [<no elements>] ]
      

      到元素大小为 2 的数组

      np.concatenate((difference,[i]))  # Specifically [i] which is [ [ 0., 55.] ]
      

      您可以尝试调用.reshape(),而不是使用大小为 0 的空数组来初始化它。

      # difference= np.array([[]])  # Old code
      difference= np.array([]).reshape(0, 2)  # Updated code
      

      输出

      [[  0.   55. ]
       [  0.  123.5]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-27
        • 2012-01-16
        • 1970-01-01
        • 2018-05-12
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-21
        相关资源
        最近更新 更多