Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果numpy数组中的任何列表至少包含前一行的一个值,则筛选该数组_Python_Arrays_Numpy - Fatal编程技术网

Python 如果numpy数组中的任何列表至少包含前一行的一个值,则筛选该数组

Python 如果numpy数组中的任何列表至少包含前一行的一个值,则筛选该数组,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组 b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]]) 现在,我想做以下事情:我想减少b。我想减少它的方法是,我查看b的第一个元素,即[1,2],并在此基础上,删除b中至少包含a1或a2的所有元素。在这种情况下,我将消除[1,6]和[7,2]。然后我将查看[3,4],并删除那些至少包含3或4的元素 实际上,我从列表的开头开始,对于每个元素,我删除了包含其中一个元素的其他元素 我的尝试 for a in b:

我有一个numpy数组

b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]])
现在,我想做以下事情:我想减少b。我想减少它的方法是,我查看b的第一个元素,即
[1,2]
,并在此基础上,删除b中至少包含a
1
或a
2
的所有元素。在这种情况下,我将消除
[1,6]
[7,2]
。然后我将查看
[3,4]
,并删除那些至少包含
3
4
的元素

实际上,我从列表的开头开始,对于每个元素,我删除了包含其中一个元素的其他元素

我的尝试

for a in b:
    np.insert(b[~np.array([np.any((a==b)[j]) for j in range(len(b))])], 0,a, axis = 0)
不幸的是,这不起作用

这是我尝试过的,但它不起作用,而且太长了。还有其他想法吗

编辑 我认为主要的问题是当我做
np.any((a==b)[j])
时,它只对第一个元素等于a的第一个元素的元素说真,但当它们等于第二个元素时不说真

编辑2 你认为这样行吗

for index, a in enumerate(b):
    np.insert(b[~np.array([np.any(np.logical_or(a[0]==b, a[1]==b)[j]) for j in range(len(b))])], index, a,  axis = 0)

一个简单的解决方案是使用普通的Python循环:

b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]])

final = []
seen = set()
for row in b.tolist():
    if seen.intersection(row):  # check if one element of the row has already been seen.
        continue
    else:
        # No item has been seen, so append this row and add the contents to the seen set.
        seen.update(row)
        final.append(row)

print(final)
# [[1, 2], [3, 4], [7, 10]]

我不确定是否有一个好的NumPy函数来解决这类问题,但对于纯Python来说应该已经非常快了。

一个简单的解决方案是使用一个普通的Python循环:

b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]])

final = []
seen = set()
for row in b.tolist():
    if seen.intersection(row):  # check if one element of the row has already been seen.
        continue
    else:
        # No item has been seen, so append this row and add the contents to the seen set.
        seen.update(row)
        final.append(row)

print(final)
# [[1, 2], [3, 4], [7, 10]]

我不确定是否有一个很好的NumPy函数来解决这类问题,但它在纯Python中应该已经非常快了。

根据数据的维度,您可能希望做一些不同的事情,但我通常认为解决这一问题的好方法是通过索引。 将numpy作为np导入

# Generate the data to work with
X = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]])

# Get the truth value is first value in the OR second value in the column
eq_idxs = np.logical_or(X == X[0, 0], X == X[0, 1])

# compress axis
eq_idxs = np.any(eq_idxs, axis=1)

#negate to get the remaining indexes
neq_idxs = np.logical_not(eq_idxs)

#Get the results
new_X = X[neq_idxs, :]
deleted_rows = X[eq_idxs, :]

print new_X 
产出:

[[ 3  4]
 [ 3  9]
 [ 7 10]]

如果您希望将其重复包装一段时间(X.shape[0]>0):

根据数据的维度,您可能希望做一些不同的事情,但我通常认为解决这个问题的好方法是通过索引。 将numpy作为np导入

# Generate the data to work with
X = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]])

# Get the truth value is first value in the OR second value in the column
eq_idxs = np.logical_or(X == X[0, 0], X == X[0, 1])

# compress axis
eq_idxs = np.any(eq_idxs, axis=1)

#negate to get the remaining indexes
neq_idxs = np.logical_not(eq_idxs)

#Get the results
new_X = X[neq_idxs, :]
deleted_rows = X[eq_idxs, :]

print new_X 
产出:

[[ 3  4]
 [ 3  9]
 [ 7 10]]

如果您想重复,请将其包装为一段时间(X.shape[0]>0):

只需添加一个依赖布尔索引的NumPy答案,并且(可能太多)会重新塑形和展平

import numpy as np
b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]])

# flatten it for comparisons
b = b.ravel()
idx = 0
while idx < len(b) // 2:
    row = b[idx:idx+2]
    mask = np.zeros(b.shape, dtype=bool)
    np.logical_or(b[idx+2:] == row[0], b[idx+2:] == row[1], out=mask[idx+2:])
    b = b.reshape(-1, 2)  # reshape so "row" masking can be applied easily
    mask = mask.reshape(-1, 2).any(-1)
    b = b[~mask].ravel()  # ravel again after masking
    idx += 1
print(b.reshape(-1, 2))
# array([[ 1,  2],
#        [ 3,  4],
#        [ 7, 10]])
将numpy导入为np
b=np.数组([[1,2],[3,4],[1,6],[7,2],[3,9],[7,10])
#将其展平以进行比较
b=b.ravel()
idx=0
当idx

可能这可以通过使用或类似的方法进一步改进,但我(现在)没有时间进一步改进。

只需添加一个依赖布尔索引和(可能太多)重塑和展平的NumPy答案

import numpy as np
b = np.array([[1,2], [3,4], [1,6], [7,2], [3,9], [7,10]])

# flatten it for comparisons
b = b.ravel()
idx = 0
while idx < len(b) // 2:
    row = b[idx:idx+2]
    mask = np.zeros(b.shape, dtype=bool)
    np.logical_or(b[idx+2:] == row[0], b[idx+2:] == row[1], out=mask[idx+2:])
    b = b.reshape(-1, 2)  # reshape so "row" masking can be applied easily
    mask = mask.reshape(-1, 2).any(-1)
    b = b[~mask].ravel()  # ravel again after masking
    idx += 1
print(b.reshape(-1, 2))
# array([[ 1,  2],
#        [ 3,  4],
#        [ 7, 10]])
将numpy导入为np
b=np.数组([[1,2],[3,4],[1,6],[7,2],[3,9],[7,10])
#将其展平以进行比较
b=b.ravel()
idx=0
当idx
可能这可以通过使用或类似的方法进一步改进,但我(现在)没有时间进一步改进。

我想我找到了一种方法(这几乎已经在我的编辑中),我将在这里发布它只是为了将来,我想它与一些答案类似:

for index, a in enumerate(b):
    if index >= len(b) - 1:
        break
    else:
        b  = np.insert(b[~np.array([np.any(np.logical_or(a[0]==b, a[1]==b)[j]) for j in range(len(b))])], index, a,axis=0)
这应该行得通

我想我找到了一种方法(这几乎已经在我的编辑中了),我将在这里发布它只是为了将来,我认为它与一些答案类似:

for index, a in enumerate(b):
    if index >= len(b) - 1:
        break
    else:
        b  = np.insert(b[~np.array([np.any(np.logical_or(a[0]==b, a[1]==b)[j]) for j in range(len(b))])], index, a,axis=0)

这应该可以

mmm是的,但是删除它们的顺序很重要!假设行的索引是某种排序。您希望保留那些只有唯一数字的子阵列,这样您就有了最高(即最低)的排列。最后的结果应该是
b=np.array([[1,2],[3,4],[7,10]])
。如您所见,
[1,2]
[1,6]
[7,2]
中幸存,
[3,4]
[3,9]
中幸存,但是
[7,2]
没有
[7,10]
因为
[7,2]
[1,2]
消除了,实际数据集的数组形状是什么?我还没有,但基本上这个列表是以下结果:给定一个数字(比如60k),我想在它之前创建所有数字的组合(即[0,0],[1,1],[1,59k]等等),然后我想做其他事情,但这就是大数字的来源是的,但是删除它们的顺序很重要!假设行的索引是某种排序。您希望保留那些只有唯一数字的子阵列,这样您就有了最高(即最低)的排列。最后的结果应该是
b=np.array([[1,2],[3,4],[7,10]])
。如您所见,
[1,2]
[1,6]
[7,2]
中幸存,
[3,4]
[3,9]
中幸存,但是
[7,2]
没有
[7,10]
因为
[7,2]
[1,2]
消除了,实际数据集的数组形状是什么?我还没有,但基本上这个列表是以下结果:给定一个数字(比如60k),我想在它之前创建所有的数字组合(即[0,0],[1,1],[1,59k],等等),然后我想做其他事情,但这就是大数字的来源。你认为对于10^12个元素的顺序的列表来说也会很快吗?我的意思是,比较快