创建一个索引数组,其中包含另一个数组中某个值的位置

时间:2017-04-22 19:36:06

标签: python arrays numpy

我正在尝试创建一个Python列表,其中包含另一个整数列表(或Numpy数组)中等于1的元素的索引。我正在尝试的是这样的(对于1维或2维情况):

#--- 1D case ---
A = [ 1, 0, 0, 1, 1 ]
idx = []
for i in range( len( A ) ):
    if A[ i ] == 1 : idx.append( i )

print( idx )   # [ 0, 3, 4 ]

#--- 2D case --- 
B = [ [ 1, 0, 0, 1, 1 ], [ 0, 1, 1 ] ]
idx2 = [ [] for i in range( len( B ) ) ]

for i in range( len( B ) ):
    for j in range( len( B[ i ] ) ):
        if B[ i ][ j ] == 1 : idx2[ i ].append( j )

print( idx2 )   #[ [0,3,4], [1,2] ]

这也可以更紧凑地写成

#--- 1D case ---
idx = [ i for i in range( len(A) ) if A[ i ] == 1 ]

#--- 2D case ---
idx2 = []
for i in range( len( B ) ):
    tmp = [ k for k in range( len(B[ i ]) ) if B[ i ][ k ] == 1 ]
    idx2.append( tmp )

但我想知道是否有更紧凑的方式(或内置功能)可以用于相同的目的。在纯Python,Numpy或其他地方有没有这样方便的功能......?

2 个答案:

答案 0 :(得分:3)

您可以使用numpy.where功能

查看这篇文章

Find indices of elements equal to zero from numpy array

import numpy as np

#-----1D case------
A = np.array([0,1,2,3,1,4,5,1,2])
print(np.where(A==1))

>>> (array([1, 4, 7]),)

#-----2D case------
A = np.array([[0,1,2,3],[1,2,3,5],[1,2,3,1]])
print(np.where(A==1))

>>> (array([0, 1, 2, 2]), array([1, 0, 0, 3]))

在您提供的示例中,子列表具有不同的长度numpy.array不是一个选项,因为您无法将list转换为array(子列表长度应相等)。这是另一个解决方案:

B = [ [ 1, 0, 0, 1, 1 ], [ 0, 1, 1 ] ]
inds = [(i,j) for j,ls in enumerate(B) for i,e in enumerate(ls) if e==1]
print(inds)

>>>> [(0, 0), (3, 0), (4, 0), (1, 1), (2, 1)]

其中ls对应子列表,e对应子列表的元素

答案 1 :(得分:1)

使用select substr(date,1,7), max(data1) as maximum from table1 where custom_id = '1123' and data1 <> 'NaN' group by substr(date,1,7)

numpy.where