Python 数组(filter(func,iter))不生成数组

Python 数组(filter(func,iter))不生成数组,python,arrays,numpy,Python,Arrays,Numpy,np.array不接受iterable。因此,通过传递它,过滤器的结果应该生成一个数组。但是,正如下面的示例所示,它不是。事实上,我们需要将结果包装在列表中。为什么会这样 将numpy作为np导入 rects=np.random.randint0100[10,4] 定义标准: x、 y,w,h=rect 返回x>10,y>10,w>10,h>10 printnp.arrayfiltercrit_2;,矩形 printnp.arraylistfiltercrit_,rects[:3] [[55 9

np.array不接受iterable。因此,通过传递它,过滤器的结果应该生成一个数组。但是,正如下面的示例所示,它不是。事实上,我们需要将结果包装在列表中。为什么会这样

将numpy作为np导入 rects=np.random.randint0100[10,4] 定义标准: x、 y,w,h=rect 返回x>10,y>10,w>10,h>10 printnp.arrayfiltercrit_2;,矩形 printnp.arraylistfiltercrit_,rects[:3] [[55 98 57 38] [48 59 81 18] [87 27 20 72]] 用于从iterable对象创建新的一维数组

iterable = (x*x for x in range(5))
np.fromiter(iterable, float)
你可以这样做


如下图所示,np.array不接受迭代器

f=过滤器RIT,矩形 printissubclassf.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 符合事实的 printnp.arrayf r=范围5 printissubclassr.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 错误的 printnp.arrayr [0 1 2 3 4] ls=listf printissubclassls.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 错误的 printnp.arrayls [[89 13 67 79] [48 11 46 99] [57 71 65 65]] np.array不接受迭代器

In [50]: rects=np.random.randint(0,100,[10,4]) 
    ...: def crit_(rect): 
    ...:     x,y,w,h=rect 
    ...:     return x>10 and y>10 and w>10 and h>10 
    ...:                                                                                                                   
In [51]: filter(crit_,rects)                                                                                               
Out[51]: <filter at 0x7f55a1a43ac8>
In [52]: list(_)                                                                                                           
Out[52]: 
[array([43, 57, 85, 93]),
 array([30, 22, 19, 55]),
 array([12, 96, 48, 40]),
 array([48, 13, 37, 46]),
 array([49, 15, 35, 32]),
 array([81, 81, 96, 57])]
没有过滤器/迭代:

In [60]: rects[(rects>10).all(axis=1)]                                                                                     
Out[60]: 
array([[43, 57, 85, 93],
       [30, 22, 19, 55],
       [12, 96, 48, 40],
       [48, 13, 37, 46],
       [49, 15, 35, 32],
       [81, 81, 96, 57]])

printnp.fromiterfiltercrit_2;,矩形,int给出值错误:设置带有序列的数组元素。您的筛选器生成数组,但您向fromiter承诺给它一个生成int的迭代器。您无法使用文档状态从iterable对象创建新的一维数组。您可以展平筛选器对象,稍后再重塑数组。但筛选器生成一个这里提到的迭代器,fromiter应该没有问题。另外,在我的示例中,您将生成器包装在一个元组中,与使用listfilter相同。为什么您认为numpy.array接受iterables?一般说来都没有。@emilaz你在说什么?try:np.arrayRange5 np.array文档提到的是嵌套序列,而不是iterable。@Nullman try:np.arrayTerrange5。它在一般情况下不起作用。@emilaz我在使用pycharm时,它显示np.array有签名p_对象:Union[ndarray,Iterable,int,float],。。。
In [53]: np.vstack(filter(crit_,rects))                                                                                    
/usr/local/bin/ipython3:1: FutureWarning: arrays to stack must be passed as a "sequence" type such as list or tuple. Support for non-sequence iterables such as generators is deprecated as of NumPy 1.16 and will raise an error in the future.
  #!/usr/bin/python3
Out[53]: 
array([[43, 57, 85, 93],
       [30, 22, 19, 55],
       [12, 96, 48, 40],
       [48, 13, 37, 46],
       [49, 15, 35, 32],
       [81, 81, 96, 57]])

In [55]: np.vstack(list(filter(crit_,rects)))                                                                              
Out[55]: 
array([[43, 57, 85, 93],
       [30, 22, 19, 55],
       [12, 96, 48, 40],
       [48, 13, 37, 46],
       [49, 15, 35, 32],
       [81, 81, 96, 57]])
In [60]: rects[(rects>10).all(axis=1)]                                                                                     
Out[60]: 
array([[43, 57, 85, 93],
       [30, 22, 19, 55],
       [12, 96, 48, 40],
       [48, 13, 37, 46],
       [49, 15, 35, 32],
       [81, 81, 96, 57]])