np.array (filter (fun c, iter)) не создает массив - PullRequest
2 голосов
/ 03 марта 2020

np.array принимает итерацию. Поэтому, передавая результат, filter должен создать массив. Однако, как показано в примере ниже, это не так. Фактически нужно обернуть результат в list. Почему это так?

import numpy as np
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

print(np.array(filter(crit_,rects)))
# <filter object at 0x000001F5888EE8C8>
print(np.array(list(filter(crit_,rects)))[:3])
#[[55 98 57 38]
 # [48 59 81 18]
 # [87 27 20 72]]

Ответы [ 4 ]

2 голосов
/ 03 марта 2020

Используйте numpy .fromiter , чтобы создать новый одномерный массив из повторяемого объекта.

iterable = (x*x for x in range(5))
np.fromiter(iterable, float)
1 голос
/ 03 марта 2020

Как показано ниже, np.array не принимает итераторы

f=filter(crit_,rects)
print(issubclass(f.__class__,collections.Iterator))
#True
print(np.array(f))
# <filter object at 0x000001F5888EE8C8>


r=range(5)
print(issubclass(r.__class__,collections.Iterator))
#False
print(np.array(r))
#[0 1 2 3 4]
ls=list(f)
print(issubclass(ls.__class__,collections.Iterator))
#False
print(np.array(ls))
#[[89 13 67 79]
# [48 11 46 99]
# [57 71 65 65]]

np.array не принимает итераторы

1 голос
/ 03 марта 2020

Вы можете сделать с vstack

np.vstack(filter(crit_,rects))
0 голосов
/ 03 марта 2020
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])]

vstack работает, но выдает предупреждение:

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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...