我想插入一个numpy数组,而np.interp几乎完全符合我的要求:
interp(x, xp, fp, left=None, right=None)
One-dimensional linear interpolation.
Run Code Online (Sandbox Code Playgroud)
除了这个位:
不检查x坐标序列
xp
是否正在增加.如果xp
没有增加,结果是无稽之谈.
我的xp正在下降,所以哪个更好:反转xp和fp的方向:
np.interp(x, xp[::-1], fp[::-1])
Run Code Online (Sandbox Code Playgroud)
或反转x和xp:
np.interp(-x, -xp, fp)
Run Code Online (Sandbox Code Playgroud)
还是有更好的方法?
我有一个4维数据,比如说温度numpy.ndarray
.阵列的形状是(ntime, nheight_in, nlat, nlon)
.
我为每个维度都有相应的一维数组,告诉我某个值对应的时间,高度,纬度和经度,对于这个例子,我需要height_in
给出以米为单位的高度.
现在我需要将它带到不同的高度尺寸height_out
,具有不同的长度.
以下似乎做我想要的:
ntime, nheight_in, nlat, nlon = t_in.shape
nheight_out = len(height_out)
t_out = np.empty((ntime, nheight_out, nlat, nlon))
for time in range(ntime):
for lat in range(nlat):
for lon in range(nlon):
t_out[time, :, lat, lon] = np.interp(
height_out, height_in, t[time, :, lat, lon]
)
Run Code Online (Sandbox Code Playgroud)
但是有3个嵌套循环,以及python和numpy之间的大量切换,我不认为这是最好的方法.
关于如何改进这个的任何建议?谢谢
好的,昨天我有一位同事来到我的办公室,问我一个关于他必须使用的 Fortran 代码的问题。
基本上,他使用的代码有一个长的多维数组,以及一个需要这个长的多维数组作为参数的子例程。
但是,调用该子例程的代码仅传递数组的第一个元素。但代码仍然有效。所以他问我怎么会这样。
我还没有看到他的特定代码,但这里有一个我如何理解这个问题的例子(并且它有效!):
subroutine print_array(a)
implicit none
integer :: a(10)
write(*, *) a
end subroutine print_array
program passing
implicit none
integer :: i(10)
i = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 /)
call print_array(i(1))
end program passing
Run Code Online (Sandbox Code Playgroud)
所以我告诉他,Fortran 按顺序存储数组,数组的位置与第一个元素相同,并且由于子例程需要特定的形状,因此它知道沿着这个序列读取多远,依此类推。
我还告诉他这是不好的编程习惯,他不应该自己编写这种代码。
但从那时起我一直在想:为什么写这篇文章的人首先要这样做?有理由这样做吗?(这甚至不必是一个很好的理由。)
或者我是对的,这只是愚蠢而且太容易出错?
我在F90中有类似的代码:
real(8), dimension(10,10,10) :: A
do i = 1, 1000
print*,A(i,1,1)
enddo
Run Code Online (Sandbox Code Playgroud)
我很惊讶这个工作,它比简单地循环3个维度更快i,j,k
.
有人可以解释为什么这有效吗?