Python 广播?对于循环-->;努比

Python 广播?对于循环-->;努比,python,numpy,Python,Numpy,我所拥有的: rnd_ar = np.random.randint(5, size = (10,2)) rnd_ar array([[4, 2], [2, 1], [2, 0], [3, 4], [0, 1], [0, 2], [1, 0], [0, 0], [3, 0], [1, 0]]) 我想做的是通过只使用numpy或pandas来简化以下代码: test

我所拥有的:

rnd_ar = np.random.randint(5, size = (10,2))
rnd_ar
array([[4, 2],
       [2, 1],
       [2, 0],
       [3, 4],
       [0, 1],
       [0, 2],
       [1, 0],
       [0, 0],
       [3, 0],
       [1, 0]])   
我想做的是通过只使用numpy或pandas来简化以下代码:

test = []
for i in rnd_ar:
    test.append(np.repeat(['O', 'T'],i))

test

[array(['O', 'O', 'O', 'O', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'T'], dtype='<U1'),
 array(['O', 'O'], dtype='<U1'),
 array(['O', 'O', 'O', 'T', 'T', 'T', 'T'], dtype='<U1'),
 array(['T'], dtype='<U1'),
 array(['T', 'T'], dtype='<U1'),
 array(['O'], dtype='<U1'),
 array([], dtype='<U1'),
 array(['O', 'O', 'O'], dtype='<U1'),
 array(['O'], dtype='<U1')]
但我不确定那是什么

谁能给我一些建议吗?提前谢谢

import numpy as np
rnd_ar = np.random.randint(5, size = (10,2))
rnd_ar
array([[4, 3],
       [4, 1],
       [1, 0],
       [2, 4],
       [4, 2],
       [3, 4],
       [3, 2],
       [2, 1],
       [4, 3],
       [2, 1]])
你可以用

列表理解

如果希望在不使用for循环的情况下执行此操作,则可以同时使用多个numpy函数。我会这样做:

np.split(
    np.repeat(np.array(['O', 'T'] * rnd_ar.shape[0]).reshape(rnd_ar.shape),
              rnd_ar.flatten()),
    np.cumsum(np.sum(rnd_ar, axis=1)))
上述
rnd\u ar
的输出将为:

[array(['O', 'O', 'O', 'O', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'O', 'T'], dtype='<U1'),
 array(['O'], dtype='<U1'),
 array(['O', 'O', 'T', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'O', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'T', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'O', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'T'], dtype='<U1'),
 array([], dtype='<U1')]

[array(['O','O','O','O','T','T','T'],dtype='谢谢你的回答,但我的意思是应用一个函数(np.repeat)从1D数组到2D数组的每一行…不使用loop@KevinChoi我认为您的问题不够清楚,因为您明确要求使用for循环。我添加了另一个没有for循环的解决方案。请检查。希望这有帮助。我建议修改问题标题。我认为不可能使用广播If输出的大小是可变的。所以我想列表理解是最好的解决方案。
np.repeat
确实提到了
广播
,但它的应用比像加法这样的运算符广播要复杂一些。
广播
让我们从(m,1)和(n,)中创建一个(m,n)形状数组形状数组。你想要的输出不是这样的。它是一个数组列表,数组大小变化很大。
np.split(
    np.repeat(np.array(['O', 'T'] * rnd_ar.shape[0]).reshape(rnd_ar.shape),
              rnd_ar.flatten()),
    np.cumsum(np.sum(rnd_ar, axis=1)))
[array(['O', 'O', 'O', 'O', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'O', 'T'], dtype='<U1'),
 array(['O'], dtype='<U1'),
 array(['O', 'O', 'T', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'O', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'T', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'T'], dtype='<U1'),
 array(['O', 'O', 'O', 'O', 'T', 'T', 'T'], dtype='<U1'),
 array(['O', 'O', 'T'], dtype='<U1'),
 array([], dtype='<U1')]