Передайте сетку в качестве параметра с массивом в качестве другого параметра - PullRequest
0 голосов
/ 08 мая 2020

Кажется, я припоминаю, что видел, что можно передать сетку numpy функции в качестве параметра вместе с массивом и заставить функцию сохранять весь массив целиком при итерации элементов сетки. Мне это приснилось, или кто-нибудь знает, о чем я говорю? Я безуспешно искал документацию по SOF, google и numpy.

Пример:

def makeGridandArray(i=60, j=40, ratio=10):
    arr = np.arange(i*j).reshape(i, j)
    x,y = np.meshgrid(np.arange(0, i, ratio), np.arange(0, j, ratio), sparse=True)
    return crop(x, y, ratio, arr)

def crop(x, y, ratio,  Arr):
    return np.average(Arr[x:x+ratio, y:y+ratio])

Приведенный выше код выдаст ошибку недопустимого среза, поскольку Arr повторяется вместе с сеткой.

>>> x=makeGridandArray()
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/private/var/mobile/Containers/Shared/AppGroup/A181F23F-E674-4B44-882C-B03A93E0E84A/Pythonista3/Documents/so.py", line 752, in makeGridandArray
    return crop(x,y, ratio, arr)
  File "/private/var/mobile/Containers/Shared/AppGroup/A181F23F-E674-4B44-882C-B03A93E0E84A/Pythonista3/Documents/so.py", line 755, in crop
    return np.average(Arr[x:x+ratio, y:y+ratio])
IndexError: invalid slice

В приведенном выше примере я ожидал, что будет возвращен массив 6x4 со средним значением каждого подмножества 10x10 Arr. Я понимаю, что это может быть достигнуто с помощью np.average и reshaping, но я ищу синтаксис того, как передать Arr целиком в функцию, используя преимущества передачи meshgrid функции. Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

meshgrid - это просто способ создания двух массивов, которые могут индексироваться и транслироваться вместе. Например:

In [302]: x,y=np.meshgrid([1,2,3],[4,5,6],sparse=True)                                                 
In [303]: x                                                                                            
Out[303]: array([[1, 2, 3]])
In [304]: y                                                                                            
Out[304]: 
array([[4],
       [5],
       [6]])

Один имеет форму (1,3), другой (3,1); вместе производят результат (3,3)

С добавлением (или другой двоичной математикой):

In [305]: x+y                                                                                          
Out[305]: 
array([[5, 6, 7],
       [6, 7, 8],
       [7, 8, 9]])

В качестве индексов в 2d-массиве:

In [306]: arr = np.arange(1,101).reshape(10,10)                                                        
In [307]: arr[x,y]                                                                                     
Out[307]: 
array([[15, 25, 35],
       [16, 26, 36],
       [17, 27, 37]])

Массив не может использоваться в качестве конечной точки среза:

In [310]: np.arange(10)[x: x+3]                                                                        
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-310-adcd5e98b614> in <module>
----> 1 np.arange(10)[x: x+3]

TypeError: only integer scalar arrays can be converted to a scalar index

Тот факт, что массив создается с помощью meshgrid, не означает, что он имеет специальные свойства или может использоваться так, как любой другой массив может т.

1 голос
/ 08 мая 2020

В дополнение к @ hpaulj ответу , вы можете выполнить sh то, что ищете, используя np.split:

c = np.split(arr,int(i/ratio),axis=0)
d = np.array([np.split(p,int(j/ratio),axis=1) for p in c])
e = np.average(d,axis=(-2,-1))

Проверки:

print(np.average(arr[0:10,0:10])) # 184.5
print(d.shape) # (6, 4, 10, 10)
print(e.shape) # (6, 4)
print(e[0,0]) # 184.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...