Python 数组(filter(func,iter))不生成数组
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对象创建新的一维数组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
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]])