变维数组的Python方法

2024-03-29 13:56:26 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个简单的问题,但我找不到“最佳实践”,我想知道是否有比许多if语句更简单的方法。假设我有一个方法,它接受一个变量'data',它的形状是(N,M),其中N可以变化。具体来说,有时数据是形状(M,M)的一维数组,其他时间N=100,例如数据是形状(100,M)。你知道吗

下面是当N>;1时该方法的基本代码。当N>;1或N可以等于1(或者最好是当数据.shape=(M,),而不仅仅是(1,M))?我可以写很多if语句,但我希望有一个更干净的解决方案。你知道吗

#start with variables data.shape=(N,M), vol.shape=(M,), jstarts and jends .shape=(4,)
N=3
#N=1 #uncomment to test
M=20
jstarts = np.array([0,5,12,15])
jends = np.array([3,10,14,18])
data = np.arange(0,N,M).reshape(N,M)
data_new = np.empty((N,M))

for i in range(0,N):
    for j in range(0,jstarts.size):
        jstart = jstarts[j]
        jend = jends[j]
        tmp = np.sum(data[i,jstart:jend]*vol[jstart:jend])/np.sum(vol[jstart:jend])
        data_new[i,jstart:jend] = tmp

*注意:jstart和jend依赖于j,但不依赖于i


Tags: 数据方法gtdataifnp语句array
1条回答
网友
1楼 · 发布于 2024-03-29 13:56:26

我已经有一段时间没有花太多时间在numpy上了,但是IIRC,你至少应该能够通过使用Ellipsis删除外循环:

for j in range(10):
    jstart = jstarts[j]
    jend = jends[j]
    tmp = np.sum(data[...,jstart:jend]*vol[jstart:jend], axis=1)/np.sum(vol[jstart:jend])
    data_new[..., jstart:jend] = tmp

相关问题 更多 >