【问题标题】:How to replace elements of a numpy array from two different arrays如何从两个不同的数组中替换 numpy 数组的元素
【发布时间】:2021-10-13 22:26:55
【问题描述】:

对于一个数组

array2 = np.array([np.nan, np.nan, np.nan, np.nan, 45, np.nan, 33, np.nan,
               np.nan, 32, np.nan, np.nan, 44, np.nan, 10, 53, np.nan])

因此,我需要按条件替换元素:如果一个元素小于 np.mean(array2),则应取自 ordered_array_1 = [32, 10, 33],否则 - 取自 ordered_array_2 = [44, 53, 45]

我还没有设法为此目的使用 np.putmask 或 numpy.where,例如 np.putmask(array2[~np.isnan(array2)],mask,ordered1) 根本不会替换元素。 array2 没有改变。

我希望从两个数组替换后得到这个结果:

array2 = np.array([np.nan, np.nan, np.nan, np.nan, 44, np.nan, 32, np.nan,
                   np.nan, 10, np.nan, np.nan, 53, np.nan, 33, 45, np.nan])

【问题讨论】:

  • 如果有更多元素可以替换列表中的元素会怎样?如果您有 4 个要替换的元素,而替换列表中只有 3 个
  • 什么都没有发生))而且也很奇怪(我的意思是 np.putmask)。
  • 抱歉,我提到的示例中的预期输出应该是 4 个要替换的元素,只有 3 个替换项?
  • 不能有更多元素,因为有序数组是由array2通过排除和排序生成的

标签: python numpy


【解决方案1】:

如下使用np.where + np.nanmean

import numpy as np

array2 = np.array([np.nan, np.nan, np.nan, np.nan, 45, np.nan, 33, np.nan,
                   np.nan, 32, np.nan, np.nan, 44, np.nan, 10, 53, np.nan])

ordered_array_1 = [32, 10, 33]
ordered_array_2 = [44, 53, 45]

array2[np.where(array2 < np.nanmean(array2))] = ordered_array_1
array2[np.where(array2 >= np.nanmean(array2))] = ordered_array_2

print(array2)

输出

[nan nan nan nan 44. nan 32. nan nan 10. nan nan 53. nan 33. 45. nan]

【讨论】:

  • 有效。只有一个警告:[32. 10. 33.] [45. 44. 53.] [False True True False True False] /opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:13: RuntimeWarning: invalid value encountered in less del sys.path[0] /opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:14: RuntimeWarning: invalid value encountered in greater array([nan, nan, nan, nan, 45., nan, 32., nan, nan, 10., nan, nan, 44., nan, 33., 53., nan])
  • @NikolayYasinskiy 我可以知道您使用的是哪个 numpy 版本吗?我没有收到任何警告
  • 我得到了 numpy 1.17.2
  • 我有 1.21.2 如果你更新警告消失了
  • 我很乐意,但是当conda update numpy 它说的是频道不一致并提供版本。 1.17.2 来自另一个频道。你会如何更新?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2015-10-02
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多