【问题标题】:Replacing certain elements of an array based on a given index根据给定索引替换数组的某些元素
【发布时间】:2022-01-02 20:45:28
【问题描述】:

我有三个 numpy 数组:

Arr1 = [9,7,3,1]       (1 x 4 array)
Arr2 = [[14,6],[13,2]] (2 x 2 array)
Arr3 = [0,2]           (1 x 2 array)

我需要将 Arr1 中的元素替换为 Arr2 中的元素,并使用 Arr3 中给出的相应索引,这样输出将是:

Output_Arr = [[14,6],[7],[13,2],[1]]

我编写了一些我认为是一个好的开始的代码,但它不起作用。没有错误或任何东西,只是 Arr1 没有更新,好像不满足条件:

dim1 = len(Arr1)
dim2 = len(Arr2)
dim3 = len(Arr3)

for i in range(dim1):
    for j in range(dim3):
        if i==Arr3[j]:
            Arr1[i] = Arr2[j]
        else:
            Arr1[i] = Arr1[i]

有没有人知道如何解决这个问题?

【问题讨论】:

  • output_arr 不能是 numpy 数组,因为所有行的长度都不相同。你能澄清一下吗? (我的意思是:如果它只是一个列表列表,你可以吗?或者你想要零作为填充值?)
  • @Demi-Lune 好电话。一个列表可以正常工作,这样输出就是一个“数组数组”。

标签: python arrays numpy for-loop


【解决方案1】:

您可以使用列表解析来做到这一点,这将为您节省一些代码行并使其更具可解释性,尽管它不会改善运行时,因为它在后台使用循环。另请注意,通过合并不同长度的列表,您将失去 NumPy 库的任何运行时改进,因为它被强制转换为 dtype=object

Arr1 = np.array([9,7,3,1], dtype=object)

Arr2 = np.array([[14,6], [1], [13,2]], dtype=object)

Arr3 = np.array([0,2])

result = np.array([[Arr1[i]] if not np.sum(Arr3 == i) else Arr2[i] for i in np.arange(Arr1.size)], dtype=object)

result
OUTPUT: array([list([14, 6]), list([7]), list([13, 2]), list([1])], dtype=object)

干杯

【讨论】:

  • 尽管有名字,但他的代码示例都不是数组。它们是列表!
  • @hpaulj 是的,这是因为您添加了不同形状的数组,所以numpy.array 必须采用类似python 的行为,这正是将数字存储在list 对象中。这正是我说在这种情况下(即,当使用不同形状的数组时)你失去了NumPy 库的好处的原因。你的反对意见是什么?
【解决方案2】:

您的代码生成一个列表

In [505]: Arr1 = [9,7,3,1]
     ...: Arr2 = [[14,6],[13,2]]
     ...: Arr3 = [0,2]
     ...: 
     ...: 
In [506]: dim1 = len(Arr1)
     ...: dim2 = len(Arr2)
     ...: dim3 = len(Arr3)
     ...: 
     ...: for i in range(dim1):
     ...:     for j in range(dim3):
     ...:         if i==Arr3[j]:
     ...:             Arr1[i] = Arr2[j]
     ...:         else:
     ...:             Arr1[i] = Arr1[i]
     ...: 
In [507]: Arr1
Out[507]: [[14, 6], 7, [13, 2], 1]

您可以通过更改为 Arr1[i] = [Arr1[i]] 来调整它

如果我将 Arr1Arr2 更改为数组,我确实会收到错误

Arr1=np.array([9,7,3,1])
...
ValueError: setting an array element with a sequence.

不允许尝试将np.array([14,6]) 放入数值数组的槽中。

Arr1 更改为 object dtype,确实有效:

In [511]: Arr1=np.array(Arr1,object)
...
In [513]: Arr1
Out[513]: array([array([14,  6]), 7, array([13,  2]), 1], dtype=object)

所以我很惊讶你没有收到错误,或者至少没有发生某种变化。

【讨论】:

    猜你喜欢
    • 2019-06-23
    • 2017-06-08
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多