在ndarray

时间:2017-11-24 14:07:37

标签: python python-3.x numpy

我试图在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值,我应该运行什么代码?

2 个答案:

答案 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]

当然,有很多方法可以处理边缘情况,这只是一个建议。