【问题标题】:replace elements in a m x n array using list comprehension使用列表推导替换 m x n 数组中的元素
【发布时间】:2019-01-23 22:24:59
【问题描述】:

我有一个数组:

a = array([[1,2,3,1], [2,5,3,1], [0,0,0,0], [5,3,2,5]])

我想根据每行中的最后一项(0 或 1)遍历数组。如果每行的最后一项为0,我想将该行中的其他3项(仅)更改为np.nan。

例如:

a = array([[1,2,3,1], [2,5,3,1], [nan, nan, nan, 0], [5,3,2,5]])

我可以使用 for 循环来做到这一点。即:

for frames in range(len(a)):
    if a[frames][3] == 0:
        a[frames][0:2] = np.nan

有没有更有效的方法来使用列表推导来做到这一点?到目前为止,这就是我想出的全部,但觉得它可能会更有效率:

a = np.array([[np.nan, np.nan, np.nan] if frames[3] == 0 else frames[0:3] for frames in a])

因为这将创建一个数组数组,并裁剪最后一列

提前致谢!

【问题讨论】:

  • 顺便说一句[np.nan, np.nan, np.nan] = [np.nan] * 3

标签: python arrays python-2.7 list-comprehension


【解决方案1】:

IIUC,您不需要列表理解。使用indexing

>>> a = np.array([[1,2,3,1], [2,5,3,1], [0,0,0,0], [5,3,2,5]], dtype=float)
>>> a[a[:,-1] == 0, 0:3] = np.nan

array([[  1.,   2.,   3.,   1.],
       [  2.,   5.,   3.,   1.],
       [ nan,  nan,  nan,   0.],
       [  5.,   3.,   2.,   5.]])

如果您有这些数组的字典,只需索引它们中的每一个

for a in data.values():
    a[a[:,-1] == 0, 0:3] = np.nan

【讨论】:

  • 如果这个数组是字典的一部分,那么你可以在字典的外部使用相同的索引吗?例如数据 = {a = np.array([[1,2,3,1],[3,1,2,1],[0,0,0,0],[2,4,7,1]] ), b = np.array([[2,4,1,1],[0,0,0,0],[6,3,2,1],[5,2,3,1]]) } 所以它会返回: data = {a = np.array([[1,2,3,1],[3,1,2,1],[nan,nan,nan,0],[2, 4,7,1]]), b = np.array([[2,4,1,1],[nan,nan,nan,0],[6,3,2,1],[5,2 ,3,1]])} ?
  • @NevPires 是的.. 只需迭代并索引每个值
  • 感谢您的帮助!另一个问题,将 dtype 更改为 float 有什么作用?
  • @NevPires 只是如果 dtype 是整数,则在尝试分配 np.nan 时可能会引发异常。这是一个浮点数,对它来说
猜你喜欢
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2012-01-16
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多