繁体   English   中英

增加numpy 2D数组的列

[英]Increase the columns of numpy 2D array

我有一个使用numpy和一个名为PyProj的外部程序包的玩具示例。 纬度和经度是包含某些领域特定信息的坐标的2D数组。 我想做的是计算一个球体到我任意选择的中心点的距离。 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)

最有效的方法可能是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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM