我试图在ndarray(numpy)中使用某些边界提取最大值。
例如,有ndarray N,其大小为(30000,1000),我想提取每个边界((最大值的索引)-100~(最大值的索引)+100)的最大值行。
所以我写了这样的代码
for item in N:
item = item(item.argmax()-100 : item.argmax()+100)
但在完成此任务后,我为N.shape
静止(30000,1000)如果我想(30000,200)获得N.shape值,我应该运行什么代码?
答案 0 :(得分:1)
您的代码存在的一个问题是,您并不总是在最大值附近获得200个值。想象一下,您在一行中的最大值是第二个值,那么您将只获得102个值。因此,将它重新投入到一个numpy数组中无论如何都行不通。
我的建议是,创建一个新列表并将每个项目附加到列表中,即
# Import
import numpy as np
# Random data
N=np.random.random((30000,1000))
# List for new results
Nnew=[]
# Loop
for item in N:
item = item[max([0,item.argmax()-100]) : item.argmax()+100]
Nnew.append(item)
答案 1 :(得分:0)
以下内容基于@alexblae的回答。对于列表,您需要考虑边缘情况,因为在大多数情况下,arr [-3,4] == []。你也可以使用numpy数组,通过移动你的选择以适应行,如果它接近边缘:
import numpy as np
a = 30000 # number of rows
b = 1000 # number of items in a row
c = 100 # number of items to pick
N = np.random.random((a, b))
# create a list of values close to the max
# lists varies in size if close to an edge
Nnew = []
for row in N:
idx_max = row.argmax()
# avoid indexes out of range
idx0 = max(0, idx_max - c)
idx1 = min(len(row) - 1, idx_max + c)
Nnew.append(row[idx0:idx1])
# create an array of items close to the max
# moves "window" if close to an edge to pick enough items
Nnewer = np.zeros((a, 2 * c))
for i, row in enumerate(N):
idx_max = row.argmax()
# avoid indexes out of range
if idx_max < c:
idx_max = c
elif idx_max + c >= b:
idx_max = b - 1 - c
Nnewer[i, :] = row[idx_max - c : idx_max + c]
当然,有很多方法可以处理边缘情况,这只是一个建议。