我的问题的最终目标是我想通过将数组的子数组传递给一个函数来生成一个新的数组'output',其中每个子数组的函数返回在'output'中生成一个新元素。
我的输入数组生成如下:
aggregate_input = np.random.rand(100, 5)
input = np.split(aggregate_predictors, 1, axis=1)[0]
所以现在输入如下:
print(input[0:2])
>>[[ 0.61521025 0.07407679 0.92888063 0.66066605 0.95023826]
>> [ 0.0666379 0.20007622 0.84123138 0.94585421 0.81627862]]
接下来,我想通过我的函数'condition'传递输入的每个元素(所以5个浮点数的数组),我想要返回每个函数调用来填充一个新的数组'output'。基本上,我希望'output'包含100个值。
def condition(array):
return array[4] < 0.5
如何在不使用任何讨厌的循环的情况下将每个输入元素传递到条件中?
========
基本上,我想这样做,但优化:
lister = []
for i in range(100):
lister.append(condition(input[i]))
output = np.array(lister)
初始拆分和索引什么都不做。它只是将数组包装在列表中,然后再次取出:
In [76]: x=np.random.rand(100,5)
In [77]: y = np.split(x,1,axis=1)
In [78]: len(y)
Out[78]: 1
In [79]: y[0].shape
Out[79]: (100, 5)
其余的只是测试每行的第4个元素是否<.5:
In [81]: def condition(array):
...:
...: return array[4] < 0.5
...:
In [82]: lister = []
...:
...: for i in range(100):
...: lister.append(condition(x[i]))
...:
...: output = np.array(lister)
...:
In [83]: output
Out[83]:
array([ True, False, False, True, False, True, True, False, False,
True, False, True, False, False, True, False, False, True,
False, True, False, True, False, False, False, True, False,
...], dtype=bool)
我们可以使用列索引轻松完成
In [84]: x[:,4]<.5
Out[84]:
array([ True, False, False, True, False, True, True, False, False,
True, False, True, False, False, True, False, False, True,
False, True, False, True, False, False, False, True, False,
...], dtype=bool)
换句话说,操作阵列的整个第4列。
您试图使一个非常简单的索引表达式非常复杂。如果您非常仔细地阅读np.split
的文档,您将看到传递第二个参数1绝对没有任何结果:它将数组拆分为一个块。以下行实际上是无操作,应删除:
input = np.split(aggregate_predictors, 1, axis=1)[0]
你有一个2D numpy数组形状100, 5
(你可以检查与aggregate_predictors.shape
)。您的函数返回第五列是否包含小于0.5的值。您可以使用单个矢量化表达式执行此操作:
output = aggregate_predictors[:, 4] < 0.5
如果要查找最后一列而不是第五列,请使用索引-1代替:
output = aggregate_predictors[:, -1] < 0.5
这里要记住的重要一点是,所有的比较运算符都是numpy中的元素化矢量化。通常,矢量化这样的操作涉及在数组中找到正确的索引。您永远不必将任何内容转换为列表:numpy数组可以迭代,并且有更复杂的迭代器可用。
话虽这么说,你原来的意图可能是做类似的事情
input = split(aggregate_predictors, len(aggregate_predictors), axis=0)
要么
input = split(aggregate_predictors, aggregate_predictors.shape[0])
两个表达都是等价的。他们将aggregate_predictors
分成100个单行矩阵列表。