【问题标题】:Append a one dimensional numpy array in a new x-value of a two dimensional numpy array在二维 numpy 数组的新 x 值中附加一维 numpy 数组
【发布时间】:2019-03-10 04:17:49
【问题描述】:

我正在尝试将一维 numpy 数组附加到二维,因此将一维数组插入到另一个 x 值的位置。

例子:

all_polys = [[5,6],[8,9]](在下面的错误之前还没有存储任何内容)

poly = [1,2]

预期结果:

all_polys = [[5,6],[8,9],[1,2]]

我的代码:

all_polys = numpy.array([[]])
poly = np.expand_dims(poly, axis=0)
print(poly)
print(all_polys)
all_polys = np.concatenate(all_polys, poly)

错误:

TypeError: 只有整数标量数组可以转换为标量索引

错误前打印输出:

[['400' '815' '650' '815' '650' '745' '400' '745']](添加维度的多边形)

[] (all_polies)

这真的让我很沮丧。我做错了什么?我想这一定是我忽略了一个小细节。

【问题讨论】:

  • all_polys 是作为列表 [[5,6],[8,9] 开始,还是作为数组 np.array([[5,6,8,9]]) 开始,还是作为这个无用的东西 np.array([[]])poly 是列表 [1,2] 还是数组 np.array([1,2])
  • all_polys 一开始就是那个“无用的东西”,而 poly 是一个填充了灵活数量的数字的数组。我改变了它,所以 all_polys 变得多余。相反,会启动一个列表,其中包含一定数量的元素,我会在其中添加更多列表。

标签: python arrays numpy


【解决方案1】:

从一个二维数组和一个一维数组开始:

In [26]: all_polys = np.array([[5,6],[8,9]])                                    
In [27]: poly = np.array([1,2])                                                 

vstack 很好地确保了所有输入都是二维的,然后连接:

In [28]: np.vstack((all_polys, poly))                                           
Out[28]: 
array([[5, 6],
       [8, 9],
       [1, 2]])

expand_dims 你有正确的想法:

In [29]: np.concatenate((all_polys, np.expand_dims(poly, axis=0)))              
Out[29]: 
array([[5, 6],
       [8, 9],
       [1, 2]])

但是np.array([[]]) 是一个糟糕的起点。为什么用那个?你是在迭代地做这个吗?

对于迭代工作,我们建议使用列表:

In [30]: alist = []                                                             
In [31]: alist.append([5,6])                                                    
In [32]: alist.append([8,9])                                                    
In [33]: alist.append([1,2])                                                    
In [34]: np.array(alist)                                                        
Out[34]: 
array([[5, 6],
       [8, 9],
       [1, 2]])

我不鼓励使用np.append。它经常被滥用。

【讨论】:

  • @hpaulj:很好。您对vstack 与二维和一维数组的混合使用感到惊讶。预计它会引发错误,因为它似乎不满足规则“除了第一个轴之外,数组必须沿所有方向具有相同的形状”——它们甚至不是同一等级。
【解决方案2】:

你可以试试 append 函数而不是 expand_dims

import numpy as np
all_polys = [[5,6],
             [8,9]]
all_polys = np.append(all_polys,[ [1,2] ], axis=0)
print(all_polys)
#Output=
#all_polys = [[5,6],
#             [8,9],
#             [1,2]]

【讨论】:

    【解决方案3】:

    你只需要这样做:

    all_polys = np.concatenate((all_polys, poly[None,:]), axis=0)
    

    我们连接的两个数组是all_polys,看起来像[[5,6],[8,9]],和poly[None,:],看起来像[[1.2]]

    axis=0 指定串联必须沿这些数组的最外层(第一个)维度进行。

    【讨论】:

    • 还有一种方法可以对保存条目数量不同的数组执行此操作吗?像 all_polys = [[1,4]] 和 poly = [7,8,4,3] 来创建 [[1,4],[7,8,4,3]]?我得到一个值错误:除了连接轴之外的所有输入数组维度必须完全匹配
    • 对于您问题中的示例,数组已经具有不同数量的存储元素。 all_polys 有 4 个元素,poly 有 2 个元素。我认为您现在评论中的问题是关于在连接之前展平数组。为此,您可以使用 my_flat = np.concatenate((all_polys.ravel(), poly.ravel()), axis=0) 之类的东西。顺便说一句,如果你不通过axis=0concatenate() 将使用默认值 0,这对我们来说很好。
    【解决方案4】:

    你应该这样做。

    arr = [old array]
    newArr = numpy.append(arr, [new_array])
    

    使用 append 函数会起作用。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 1970-01-01
      • 2012-08-29
      • 2021-03-20
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多