Python 矢量化包含迭代器(Numpy数组)的for循环

Python 矢量化包含迭代器(Numpy数组)的for循环,python,numpy,list-comprehension,vectorization,Python,Numpy,List Comprehension,Vectorization,我试图通过利用Numpy中的矢量化特性使python函数运行得更快 该函数的目的是,在for循环的每次迭代结束时,位置arr[i,0](即每行的第一个条目)将包含2D数组(数据)中的行数,如果在位置0,其值小于或等于该数组或数组i # Data is a 2D array def function(data) n = len(data) arr = np.zeros(shape=(n, 9)) for i, sample in enumerate(data):

我试图通过利用Numpy中的矢量化特性使python函数运行得更快

该函数的目的是,在for循环的每次迭代结束时,位置arr[i,0](即每行的第一个条目)将包含2D数组(数据)中的行数,如果在位置0,其值小于或等于该数组或数组i

# Data is a 2D array
def function(data)
    n = len(data)
    arr = np.zeros(shape=(n, 9))
    for i, sample in enumerate(data):
        arr[i][0] = np.count_nonzero(data[:, 0] <= data[i][0])

但我得到一个生成器错误:

TypeError: float() argument must be a string or a number, not 'generator'

如何将此for循环矢量化?

在您对我的初始解决方案的评论中,您写道:在第0列中,否 元素小于0。所以这让我得出一个结论,在
你的函数应该是
(np.count非零(data[:,x]>data[i][x]),对于基尼数组中的i[:,0])
这不是它返回生成器的列表理解。添加示例输入和预期输出您的代码不完整。看看arr=np.zeros(shape=(n*9)。它包含不平衡的括号。在末尾加“)”就足够了吗?那么n和数据的值是什么呢?我不能在这里粘贴完整的代码,这只是一个摘录,应该传达我想要实现的。你好,谢谢你花时间回答。arr是一个二维数组。我已经修改了示例代码以反映这一点。给定上面的数组,解决方案应该是[0,2,3,1,4]。因为在列0中,没有元素小于0,2个元素小于5,3个元素小于10。。。。问题不在于找到解决办法。我需要知道如何将其矢量化并摆脱for循环。我完全用一个新的答案替换了我的初始答案,因为“旧”答案没有反映在您更正的帖子中实际要做的事情。非常感谢您的时间和努力,我们需要更多像您这样的人来处理堆栈溢出问题。你能给我解释一下这行吗:(res=np.less(dd[np.newaxis,:],dd[:,np.newaxis]).sum(axis=1))。我不懂np.less,但我不懂newaxis和sum的用法
TypeError: float() argument must be a string or a number, not 'generator'
def function(data):
    n = len(data)
    arr = np.zeros((n, 9), dtype=int)
    for i in range(n):
        arr[i, 0] = np.count_nonzero(data[:, 0] < data[i, 0])
    return arr
def fn(data):
    dd = data[:, 0]  # The first column
    res = np.less(dd[np.newaxis, :], dd[:, np.newaxis]).sum(axis=1)
    return np.hstack([res[:, np.newaxis], np.zeros((dd.size, 8), dtype=int)])
data = np.arange(25).reshape(5,-1)
data[3,0] = 1
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [ 1, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [2, 0, 0, 0, 0, 0, 0, 0, 0],
       [3, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0],
       [4, 0, 0, 0, 0, 0, 0, 0, 0]])
array([[ 0],
       [ 5],
       [10],
       [ 1],
       [20]])
array([[0, 0, 0, 0, 0],
       [1, 0, 0, 1, 0],
       [1, 1, 0, 1, 0],
       [1, 0, 0, 0, 0],
       [1, 1, 1, 1, 0]])