亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在不使用 np.apply_along_axis() 的情況下在鋸齒狀 Numpy ?

如何在不使用 np.apply_along_axis() 的情況下在鋸齒狀 Numpy ?

蠱毒傳說 2022-06-07 17:21:32
我正在嘗試加快進程,我認為這可能使用 numpy 的 apply_along_axis 來實現。問題是并非我所有的軸都具有相同的長度。當我做:a = np.array([[1, 2, 3],               [2, 3, 4],               [4, 5, 6]])b = np.apply_along_axis(sum, 1, a)print(b)這工作正常。但我想做類似的事情(請注意,第一行有 4 個元素,其余有 3 個):a = np.array([[1, 2, 3, 4],               [2, 3, 4],               [4, 5, 6]])b = np.apply_along_axis(sum, 1, a)print(b)但這失敗了,因為:numpy.AxisError:軸 1 超出維度 1 數組的范圍我環顧四周,發現唯一的“解決方案”是添加零以使所有數組的長度相同,這可能會破壞性能改進的目的。有沒有辦法在非規則形狀的 numpy 數組上使用 numpy_apply_along_axis ?
查看完整描述

2 回答

?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

您可以通過以矢量化方式用零填充它們來將可迭代對象的初始數組轉換為 ndarray:


import numpy as np


a = np.array([[1, 2, 3, 4], 

              [2, 3, 4], 

              [4, 5, 6]])

max_len = len(max(a, key = lambda x: len(x))) # max length of iterable-objects contained in array

cust_func = np.vectorize(pyfunc=lambda x: np.pad(array=x, 

                                                 pad_width=(0,max_len), 

                                                 mode='constant', 

                                                 constant_values=(0,0))[:max_len], otypes=[list])

a_pad = np.stack(cust_func(a))

輸出:


array([[1, 2, 3, 4],

       [2, 3, 4, 0],

       [4, 5, 6, 0]])


查看完整回答
反對 回復 2022-06-07
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

這取決于。您之前知道向量的大小還是要添加到列表中?


參見例如http://stackoverflow.com/a/58085045/7919597


例如,您可以填充數組


import numpy as np


a1 = [1, 2, 3, 4]

a2 = [2, 3, 4, np.nan] # pad with nan

a3 = [4, 5, 6, np.nan] # pad with nan


b = np.stack([a1, a2, a3], axis=0)


print(b)


# you can apply the normal numpy operations on 

# arrays with nan, they usually just result in a nan

# in a resulting array

c = np.diff(b, axis=-1)


print(c)

之后,您可以在列上的每一行上應用一個移動窗口。


看看https://stackoverflow.com/a/22621523/7919597,它只有 1d,但可以讓您了解它是如何工作的。


可以通過 scipy.signal.convolve2d 使用只有一行作為內核的二維數組(形狀例如 (1, 3)),并使用上面的想法。這是獲得“逐行一維卷積”的解決方法:


from scipy import signal


krnl = np.array([[0, 1, 0]])


d = signal.convolve2d(c, krnl, mode='same')

print(d)


查看完整回答
反對 回復 2022-06-07
  • 2 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號