增加 numpy 二维数组的列数
Increase the columns of numpy 2D array
我有这个玩具示例,它使用 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 具有相同的形状,所有常数值都是中心纬度和经度。在不使用 for 循环的情况下,增加 lon_0 和 lat_0 的列并用中心值填充使其与 lon 和 lat 形状相同的最有效方法是什么?
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)
不是 100% 确定我理解您的需求,我的建议似乎不够有效,但要沿指定轴多次复制数组,您可以使用 numpy repeat
所以在你的情况下你可以
lon_0 = np.repeat(lon_0, 50, axis=1)
最有效的方法可能是 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]])
我有这个玩具示例,它使用 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 具有相同的形状,所有常数值都是中心纬度和经度。在不使用 for 循环的情况下,增加 lon_0 和 lat_0 的列并用中心值填充使其与 lon 和 lat 形状相同的最有效方法是什么?
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)
不是 100% 确定我理解您的需求,我的建议似乎不够有效,但要沿指定轴多次复制数组,您可以使用 numpy repeat
所以在你的情况下你可以
lon_0 = np.repeat(lon_0, 50, axis=1)
最有效的方法可能是 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]])