Увеличьте столбцы numy 2D-массива

У меня есть этот игрушечный пример, который использует numpy и внешний пакет под названием PyProj. Lat и lon - это двумерные массивы, которые содержат координаты некоторой специфичной для домена информации. Что я хочу сделать, это рассчитать расстояние на сфере от центральной точки, которую я выбираю произвольно. Форма lat_0 и lon_0 это

(2000,1)

Но вызов API inv не такой. Я получаю ошибку во время выполнения -

 RuntimeError: Buffer lengths not the same

Он хочет массив формы

(2000,50). 

Поэтому я хочу, чтобы значения lat_0 и lon_0 были одинаковыми с lon и lat со всеми постоянными значениями, которые являются центральной широтой и долготой. Каков наиболее эффективный способ увеличить столбцы lon_0 и lat_0 и заполнить его центральным значением, чтобы он имел ту же форму, что и lon и lat без использования циклов for?

import numpy as np
from pyproj import Geod

lat = np.empty((2000,50))
lat.fill(1)
lon = np.empty((2000,50))
lon.fill(1)


center = int(np.floor(len(lon[-1]) / 2.))
lon_0 = lon[:,center][...,np.newaxis]
lat_0 = lat[:,center][...,np.newaxis]


g = Geod(ellps='WGS84')

distance = g.inv(lon,lat,lon_0,lat_0,radians=True)

2 ответа

Решение

Наиболее эффективный способ, вероятно, будет np.broadcast_arrays, Это создает представления меньших массивов без увеличения буфера данных. Общий пример:

    >>> A = np.arange(10).reshape(2, 5)
>>> A
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> B = np.c_[:2]
>>> B
array([[0],
       [1]])
>>> C = np.arange(5)
>>> D = 7

>>> np.broadcast_arrays(A, B)
[array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]]), array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1]])]
>>> np.broadcast_arrays(A, C)
[array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]]), array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])]
>>> np.broadcast_arrays(A, D)
[array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]]), array([[7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7]])]

Чтобы увидеть, что данные являются общими:

>>> AA, BB = np.broadcast_arrays(A, B)
>>> BB
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1]])
>>> BB[0,0] = 3
>>> BB
array([[3, 3, 3, 3, 3],
       [1, 1, 1, 1, 1]])
>>> B
array([[3],
       [1]])

Не уверен на 100%, что я понял, что вам нужно, мое предложение кажется неэффективным, но чтобы скопировать массив несколько раз вдоль указанной оси, вы можете использовать numpy repeat

Так что в вашем случае вы могли бы сделать

lon_0 = np.repeat(lon_0, 50, axis=1)
Другие вопросы по тегам