Python:如何将数组的子数组传递给数组函数

时间:2018-01-03 17:16:43

标签: python arrays numpy

我的问题的最终目标是我想要生成一个新阵列'输出'通过将数组的子数组传递给函数,其中每个子数组的函数返回生成一个新元素到'输出'。

我的输入数组生成如下:

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个浮点数的数组)。我想要返回每个函数调用以填入一个新数组'输出'。基本上,我想要'输出'包含100个值。

def condition(array):

    return array[4] < 0.5

如何在不使用任何讨厌的循环的情况下将输入的每个元素传递到条件中?

======

基本上,我想这样做,但优化:

lister = []

for i in range(100):
    lister.append(condition(input[i]))

output = np.array(lister)

2 个答案:

答案 0 :(得分:0)

初始拆分和索引什么都不做。它只是将数组包装在列表中,然后再次取出:

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个元素是否为&lt; .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列。

答案 1 :(得分:0)

您正试图使一个非常简单的索引表达式变得非常复杂。如果你仔细阅读np.split的文档,你会发现传递第二个参数1绝对没有任何意义:它将数组拆分为一个块。以下行实际上是无操作,应删除:

</li><ol></p></h1>

你有一个形状为input = np.split(aggregate_predictors, 1, axis=1)[0] 的2D numpy数组(你可以用100, 5来检查)。您的函数返回第五列是否包含小于0.5的值。您可以使用单个矢量化表达式执行此操作:

aggregate_predictors.shape

如果要查找最后一列而不是第五列,请改用index -1:

output = aggregate_predictors[:, 4] < 0.5

这里要记住的重要一点是,所有的比较运算符都是numpy中的元素化矢量化。通常,矢量化这样的操作涉及在数组中找到正确的索引。您永远不必将任何内容转换为列表:numpy数组可以迭代,并且有更复杂的迭代器可用。

话虽如此,你最初的意图可能是做

之类的事情
input = split(aggregate_predictors, len(aggregate_predictors), axis=0)

OR

input = split(aggregate_predictors, aggregate_predictors.shape[0])

两个表达式都是等价的。他们将output = aggregate_predictors[:, -1] < 0.5 拆分为100个单行矩阵列表。