繁体   English   中英

将 numpy 将 function 应用于二维数组

[英]Applying numpy take function to 2d array

我有以下二维 numpy 数组:

array_a = np.array([[6.2, 2.0, 5.5, 8.0], [6.0, 5.1, 7.1, 8.2], ...])

我还有一个索引列表列表(列表大小不同)代表我想从该数组中选择的值。

wanted_values = [[0,3], [1,2,3], ...]

最后,我想要一个 2d numpy 数组,其中每一行只有与这些索引对应的值。 所需的 output 如下所示:

np.array([[6.2, 8.0], [5.1, 7.1, 8.2], ...])

我将索引列表转换为 numpy 数组,并警告说“不推荐使用从不规则嵌套序列创建 ndarray”。 然后,我将 function 应用到 numpy 数组并得到一个错误:

a.take(wanted_values) 
TypeError: Cannot cast array data from dtype('O') to dtype('int64') according to the rule 'safe'

我怎样才能达到预期的效果? 有没有更好的方法来 go 关于这个?

从这里开始工作

[array_a[i][wanted_values[i]] for i in range(len(wanted_values))]

#output

[array([6.2, 8. ]), array([5.1, 7.1, 8.2])]

您的数组中的行大小有问题。 考虑以下示例

>>> a = np.array([[1],[1,2]])
<stdin>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested 
sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different 
lengths or shapes) is deprecated. If you meant to do this, you must specify 
'dtype=object' when creating the ndarray

此外,numpy function take无法按预期工作。 也就是说,鉴于 numpy 承认了参差不齐的嵌套序列,function 所做的是:

  1. 它使阵列变平,
  2. 在您的情况下,它会从由 function 的第二个参数中的数字索引的扁平数组中获取元素wanted_values并以与您的代码给出的代码相同的方式将它们放置在wanted_valuesnp.array([6.2, 8.0],[2.0, 5.5, 8.0], ...])这与您的预期不同。

我建议您将每个选择存储在您构建的同时迭代两个可迭代对象的列表选择中:

array_a = np.array([[6.2, 2.0, 5.5, 8.0], [6.0, 5.1, 7.1, 8.2]])
wanted_values = [[0,3], [1,2,3]]
choice = []
for xs, indices in zip(array_a, wanted_values):
   choice.append(xs[indices])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM