如何从 list/ndarray 获取索引?
How to get indices from a list/ndarray?
我有一个如下所示的列表:
[[0,1,2], [1,2,3], [2,3,4], [3,4,5]]
我可以把它变成这样的数组:
array([[0,1,2],
[1,2,3],
[2,3,4],
[3,4,5]])
所以我总共有 4 行,每行有 3 列。现在我想找到所有大于2的元素的索引,所以对于整个矩阵,索引应该是:
((1,2),(2,1),(2,2),(3,1),(3,2),(3,3))
然后对于每一行,我会随机挑选一个col索引,它表示一个值大于2。现在我的代码是这样的:
a = np.array([[0,1,2],[1,2,3],[2,3,4],[3,4,5]]
out = np.ones(4)*-1
cur_row = 0
col_list = []
for r,c in np.nonzero(a>2):
if r == cur_row:
col_list.append(c)
else:
cur_row = r
shuffled_list = shuffle(col_list)
out[r-1] = shuffled_list[0]
col_list = []
col_list.append(c)
我希望得到一个如下所示的输出:
array([-1, 2, 1, 2])
但是,现在当我 运行 我的代码时,它显示
ValueError: too many values to unpack
有人知道我如何解决这个问题吗?或者我应该怎么做才能达到我的目标?我只想 运行 代码尽可能快,所以任何其他好的想法也非常受欢迎。
试试这个。
import numpy as np
arr = np.array([[0,1,2],
[1,2,3],
[2,3,4],
[3,4,5]])
indices = np.where(arr>2)
for r, c in zip(*indices):
print(r, c)
版画
1 2
2 1
2 2
3 0
3 1
3 2
所以,它应该可以工作。您也可以使用 itertools.izip
,在这种情况下它甚至是更好的选择。
一个纯粹的 numpy
解决方案(感谢@AshwiniChaudhary 的提议):
for r, c in np.vstack(np.where(arr>2)).T:
...
尽管我不确定这会比使用 izip 或 zip 更快。
您可以将数组与您的值进行比较并使用 where。
a = np.array([[0,1,2],[1,2,3],[2,3,4],[3,4,5]])
np.where(a>2)
(array([1, 2, 2, 3, 3, 3], dtype=int64), array([2, 1, 2, 0, 1, 2],
dtype=int64))
获取元组
list(zip(*np.where(a>2)))
[(1, 2), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2)]
我已经弄出来了,代码应该是:
a = np.array([[0,1,2],[1,2,3],[2,3,4],[3,4,5]])
out = np.ones(4)*-1
cur_row = 0
col_list = []
for r,c in zip(*(np.nonzero(a>2))):
if r == cur_row:
col_list.append(c)
else:
cur_row = r
shuffle(col_list)
if len(col_list) == 0:
out[r-1] = -1
else:
out[r-1] = col_list[0]
col_list = []
col_list.append(c)
shuffle(col_list)
if len(col_list) == 0:
out[len(out)-1] = -1
else:
out[len(out)-1] = col_list[0]
最后但在 forloop 之外的部分是确保处理最后一行。
它适用于我的情况。
我有一个如下所示的列表:
[[0,1,2], [1,2,3], [2,3,4], [3,4,5]]
我可以把它变成这样的数组:
array([[0,1,2],
[1,2,3],
[2,3,4],
[3,4,5]])
所以我总共有 4 行,每行有 3 列。现在我想找到所有大于2的元素的索引,所以对于整个矩阵,索引应该是:
((1,2),(2,1),(2,2),(3,1),(3,2),(3,3))
然后对于每一行,我会随机挑选一个col索引,它表示一个值大于2。现在我的代码是这样的:
a = np.array([[0,1,2],[1,2,3],[2,3,4],[3,4,5]]
out = np.ones(4)*-1
cur_row = 0
col_list = []
for r,c in np.nonzero(a>2):
if r == cur_row:
col_list.append(c)
else:
cur_row = r
shuffled_list = shuffle(col_list)
out[r-1] = shuffled_list[0]
col_list = []
col_list.append(c)
我希望得到一个如下所示的输出:
array([-1, 2, 1, 2])
但是,现在当我 运行 我的代码时,它显示
ValueError: too many values to unpack
有人知道我如何解决这个问题吗?或者我应该怎么做才能达到我的目标?我只想 运行 代码尽可能快,所以任何其他好的想法也非常受欢迎。
试试这个。
import numpy as np
arr = np.array([[0,1,2],
[1,2,3],
[2,3,4],
[3,4,5]])
indices = np.where(arr>2)
for r, c in zip(*indices):
print(r, c)
版画
1 2
2 1
2 2
3 0
3 1
3 2
所以,它应该可以工作。您也可以使用 itertools.izip
,在这种情况下它甚至是更好的选择。
一个纯粹的 numpy
解决方案(感谢@AshwiniChaudhary 的提议):
for r, c in np.vstack(np.where(arr>2)).T:
...
尽管我不确定这会比使用 izip 或 zip 更快。
您可以将数组与您的值进行比较并使用 where。
a = np.array([[0,1,2],[1,2,3],[2,3,4],[3,4,5]])
np.where(a>2)
(array([1, 2, 2, 3, 3, 3], dtype=int64), array([2, 1, 2, 0, 1, 2], dtype=int64))
获取元组
list(zip(*np.where(a>2)))
[(1, 2), (2, 1), (2, 2), (3, 0), (3, 1), (3, 2)]
我已经弄出来了,代码应该是:
a = np.array([[0,1,2],[1,2,3],[2,3,4],[3,4,5]])
out = np.ones(4)*-1
cur_row = 0
col_list = []
for r,c in zip(*(np.nonzero(a>2))):
if r == cur_row:
col_list.append(c)
else:
cur_row = r
shuffle(col_list)
if len(col_list) == 0:
out[r-1] = -1
else:
out[r-1] = col_list[0]
col_list = []
col_list.append(c)
shuffle(col_list)
if len(col_list) == 0:
out[len(out)-1] = -1
else:
out[len(out)-1] = col_list[0]
最后但在 forloop 之外的部分是确保处理最后一行。
它适用于我的情况。