【问题标题】:Filling 2D numpy array based on True/False value contained in another array in Python根据 Python 中另一个数组中包含的 True/False 值填充 2D numpy 数组
【发布时间】:2018-01-25 21:45:06
【问题描述】:

我有一个大小为 4 的一维空 numpy 数组 (b),我想在其中堆叠列。列中包含的值取决于另一个包含 True/False 布尔值的一维 numpy 数组 (a)。

我已经设法以我想要使用 for 循环的方式填充它,但我认为使用切片可以更有效地完成它。

这是给我正确结果的工作代码:

import numpy as np
import random

b = np.empty(4, dtype=object) # The array we are trying to fill

for i in range (5):
    # a contains 4 random True/False values
    a = np.random.randint(0,2,size=(4), dtype=bool)

    # If a row is true in a then b should contain data, otherwise nan
    data =  random.random()

    iteration = 0
    for value in a :
        if b[iteration] is None: # We check if b is empty, if yes we initialize
            if (value): # If the row in a is true we fill with the value
                b[iteration]=np.array([data])
            else:
                b[iteration]=np.array([np.nan])
        else: # If b is not empty then we just stack
            if (value):
                b[iteration]=np.hstack([b[iteration],data])
            else:
                b[iteration]=np.hstack([b[iteration],np.nan])
        iteration +=1
print(b)

输出:

array([array([       nan, 0.04209371, 0.03540539,        nan, 0.59604905]),
       array([0.66677989,        nan, 0.03540539,        nan,        nan]),
       array([0.66677989, 0.04209371, 0.03540539,        nan, 0.59604905]),
       array([0.66677989, 0.04209371, 0.03540539,        nan,        nan])],
      dtype=object)

我使用 numpy 数组切片尝试了以下代码,但它给了我一个错误:

b = np.empty(4, dtype=object)

for i in range (5):
    a =  np.random.randint(0,2,size=(4), dtype=bool)
    data =  random.random()
    b[a] = np.vstack([b[a],np.zeros(len(b[a]))+data])
print(b)

输出:

TypeError: NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 2 dimensions

我正在尝试找到解决此问题的最有效方法,有什么建议吗?

【问题讨论】:

  • 那么您的b 是什么样的?它的初始值是一个用None填充的对象数组。
  • anp.random.randint(0,2,size=(4), dtype=bool) 是一种创建随机布尔数组的更简洁的方法。
  • b = np.empty(4, dtype=object) 不是二维数组。
  • True b 开始是一个长度为 4 的空 1D 数组,一旦我开始堆叠列,它就变成 2d(在这种情况下为 4x4)。我会纠正我的问题。
  • 它仍然是 1d,即使它包含数组。检查它的形状。

标签: python arrays numpy


【解决方案1】:

我没有试图弄清楚你的第二种方法有什么问题。

从输出中,您首先创建一个 4 元素数组,其中每个元素都是一个 4 元素数组,随机放置一个 np.nan

这是一种直接的二维数组方法来生成相同类型的数组:

一个 4x4 的随机浮点数组:

In [29]: b = np.random.rand(4,4)
In [30]: b
Out[30]: 
array([[0.12820464, 0.41477273, 0.35926356, 0.15205777],
       [0.28082327, 0.76574665, 0.2489097 , 0.17054426],
       [0.20950568, 0.78342284, 0.14498205, 0.52107821],
       [0.74684041, 0.83661847, 0.29467814, 0.66062565]])

相同大小的布尔数组:

In [31]: a = np.random.randint(0,2, size=(4,4), dtype=bool)
In [32]: a
Out[32]: 
array([[False,  True, False,  True],
       [ True,  True, False,  True],
       [False, False, False, False],
       [False, False,  True, False]])

使用a作为掩码或布尔索引,将b的每个对应元素替换为nan

In [33]: b[a]=np.nan
In [34]: b
Out[34]: 
array([[0.12820464,        nan, 0.35926356,        nan],
       [       nan,        nan, 0.2489097 ,        nan],
       [0.20950568, 0.78342284, 0.14498205, 0.52107821],
       [0.74684041, 0.83661847,        nan, 0.66062565]])

这是一个真正的二维浮点数组,而不是数组数组。该对象数组方法适用于列表,但不是质量numpy 编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多