ndarray 上的 Numpy 除法

我想创建一个包含另一个 ndarray 比率的新数组。


第一个简单的例子:


import numpy as np

week = np.full((3, 4), 2, dtype=float)

week[:,2] = 0

week[2,0:2] =0

week[0,3] =0.99

week[1,3] =1.99

week[2,3] =0.89


week

回报


array([[2.  , 2.  , 0.  , 0.99],

       [2.  , 2.  , 0.  , 1.99],

       [0.  , 0.  , 0.  , 0.89]])

现在我想计算一个包含周 [:,3] 比率的 ndarray


ratio =  week[:,3].reshape(1,-1).T/ week[:,3]

回报


array([[1.   , 0.497, 1.112],

       [2.01 , 1.   , 2.236],

       [0.899, 0.447, 1.   ]])

正是我想要的。


更一般的情况 一个 5d 数组,其中前 4 个维度可以改变


weeks_5d= np.full((1,1,2, 3, 4), 2, dtype=float)

weeks_5d[:,:,:,:,2] = 0

weeks_5d[:,:,0,2,0:2] =0

weeks_5d[:,:,1,1,0:2] =0

weeks_5d[:,:,:,0,3] = 0.99

weeks_5d[:,:,:,1,3] = 1.99

weeks_5d[:,:,:,2,3] = 0.89


weeks_5d

回报


array([[[[[2.  , 2.  , 0.  , 0.99],

          [2.  , 2.  , 0.  , 1.99],

          [0.  , 0.  , 0.  , 0.89]],


         [[2.  , 2.  , 0.  , 0.99],

          [0.  , 0.  , 0.  , 1.99],

          [2.  , 2.  , 0.  , 0.89]]]]])

现在我想为每个 ndarray 计算相同的比率


转置 5darray 会返回奇怪的结果。


我需要的是


   array([[[[[1.   , 0.497, 1.112],

              [2.01 , 1.   , 2.236],

              [0.899, 0.447, 1.   ]]],


             [[1.   , 0.497, 1.112],

              [2.01 , 1.   , 2.236],

              [0.899, 0.447, 1.   ]]]]])


蓝山帝景
浏览 287回答 1
1回答

FFIVE

我认为循环是你最好的希望,有一个缓慢和快速的方法来做到这一点:缓慢的方式:def get_ratios(arr):    ni, nj, nk = arr.shape[:3]    last_dim = arr.shape[3]    new_arr = np.zeros(shape=(ni, nj, nk, last_dim, last_dim),                       dtype=np.float64)    for i in range(ni):        for j in range(nj):            for k in range(nk):                week = arr[i, j, k]                ratio = week[:, 3].reshape(-1, 1) / week[:, 3]                new_arr[i, j, k] = ratio    return new_arrget_ratios(weeks_5d)印刷array([[[[[1.        , 0.49748744, 1.11235955],          [2.01010101, 1.        , 2.23595506],          [0.8989899 , 0.44723618, 1.        ]],         [[1.        , 0.49748744, 1.11235955],          [2.01010101, 1.        , 2.23595506],          [0.8989899 , 0.44723618, 1.        ]]]]])显然,在 python 中循环数组很慢,但这numba就是发明的目的:快速(呃)方式from numba import njit@njitdef get_ratios(arr):    ni, nj, nk = arr.shape[:3]    last_dim = arr.shape[3]    new_arr = np.zeros(shape=(ni, nj, nk, last_dim, last_dim),                       dtype=np.float64)    for i in range(ni):        for j in range(nj):            for k in range(nk):                week = arr[i, j, k, :, 3]                for d1 in range(last_dim):                    for d2 in range(last_dim):                        new_arr[i, j, k, d1, d2] = week[d1] / week[d2]    return new_arrget_ratios(weeks_5d)印刷array([[[[[1.        , 0.49748744, 1.11235955],          [2.01010101, 1.        , 2.23595506],          [0.8989899 , 0.44723618, 1.        ]],         [[1.        , 0.49748744, 1.11235955],          [2.01010101, 1.        , 2.23595506],          [0.8989899 , 0.44723618, 1.        ]]]]])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python