【问题标题】:Access one dimensional array with array of array indices in python在python中使用数组索引数组访问一维数组
【发布时间】:2021-08-19 18:59:49
【问题描述】:
x = array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])

nbd = array([array([1], dtype=int64), array([0, 2], dtype=int64), array([1, 3], dtype=int64),
 array([2, 4], dtype=int64), array([3, 5], dtype=int64), array([4, 6], dtype=int64),
 array([5, 7], dtype=int64), array([6, 8], dtype=int64), array([7, 9], dtype=int64),
 array([ 8, 10], dtype=int64), array([9], dtype=int64)], dtype=object)

nbd 是具有 x 索引的数组数组。

我正在寻找数组“x_nbd”的数组,以便它在 nbd 索引处保存 x 值。

即,

x_nbd = array([array([0.5]), array([0., 1.]), array([0.5, 1.5]), array([1., 2.]),
       array([1.5, 2.5]), array([2., 3.]), array([2.5, 3.5]),
       array([3., 4.]), array([3.5, 4.5]), array([4., 5.]), array([4.5])],
      dtype=object)

我试过 x_nbd = x[nbd] 但没有运气。我找到了一种方法,但是对于大数据来说它非常慢,因为它通过循环运行每个元素。那是

 x_nbd = np.array([np.array(x[e]) for e in nbd]).

此外,它显示“VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (这是一个列表或元组的列表或元组或具有不同长度或形状的 ndarray) 已被弃用。如果你打算这样做这个,你必须在创建 ndarray 时指定 'dtype=object'。"

有没有更快的方法在 python 中得到这个?或如何在 python 中使用 numpy 实际实现这一点?

【问题讨论】:

  • 这就是你必须做的。 nbd 是具有不同形状的数组的 list,结果也是一个(或 object dtype 数组,实际上是相同的)。请记住,numpy 在处理具有数字 dtype 的多维数组时处于最佳状态。
  • 你打算以后用那个参差不齐的数组做什么?也许您应该坚持使用列表,而不使用数组包装器。
  • @hpaulj 我认为数组或列表没有太大区别。此外,当我使用: x_nbd = np.array([np.array(x[e]) for e in nbd]) 时,如何避免该弃用警告?
  • 我可以引用警告吗? “如果您打算这样做,则必须在创建 ndarray 时指定 'dtype=object'。”

标签: python arrays numpy multidimensional-array


【解决方案1】:

忘记不必要的array 包装器。简单的列表推导是正确的方法——从索引列表到列表数组。这没有什么“多维”的。

In [84]: array=np.array
    ...: int64=np.int64
    ...: x = array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])
    ...: 
    ...: nbd = [array([1], dtype=int64), array([0, 2], dtype=int64), array([1, 3], dtype=int64)
    ...: ,
    ...:  array([2, 4], dtype=int64), array([3, 5], dtype=int64), array([4, 6], dtype=int64),
    ...:  array([5, 7], dtype=int64), array([6, 8], dtype=int64), array([7, 9], dtype=int64),
    ...:  array([ 8, 10], dtype=int64), array([9], dtype=int64)]
In [85]: [x[i] for i in nbd]
Out[85]: 
[array([0.5]),
 array([0., 1.]),
 array([0.5, 1.5]),
 array([1., 2.]),
 array([1.5, 2.5]),
 array([2., 3.]),
 array([2.5, 3.5]),
 array([3., 4.]),
 array([3.5, 4.5]),
 array([4., 5.]),
 array([4.5])]

现在,如果索引数组的大小都相同,您可以创建一个二维数组:

In [86]: np.stack(nbd[1:-1])
Out[86]: 
array([[ 0,  2],
       [ 1,  3],
       [ 2,  4],
       [ 3,  5],
       [ 4,  6],
       [ 5,  7],
       [ 6,  8],
       [ 7,  9],
       [ 8, 10]])
In [87]: x[np.stack(nbd[1:-1])]
Out[87]: 
array([[0. , 1. ],
       [0.5, 1.5],
       [1. , 2. ],
       [1.5, 2.5],
       [2. , 3. ],
       [2.5, 3.5],
       [3. , 4. ],
       [3.5, 4.5],
       [4. , 5. ]])

【讨论】:

    【解决方案2】:

    你可以试试

    x_nbd = array([array([x[i], nbd[i]]) for i in range(len(x))])
    

    我注意到您在预期输出的开头有一个 array([0.5]),我认为这是一个错字,但您可以轻松地添加此元素而无需更改时间复杂度。

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      相关资源
      最近更新 更多