【发布时间】: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,即使它包含数组。检查它的形状。