使用python拆分数组中的元素
我有一个大数组,其中一部分如下所示。在每个列表中,第一个数字是开始,第二个数字是结束(因此有一个范围)。我想做的是: 1: 过滤掉小于300的列表(范围)(例如,必须删除以下数组中的第18个列表) 2: 通过以下方式获得较小的范围(列表):(开始+100)到(开始+200)。e、 g第一个列表是[569669] 我尝试在numpy中使用不同的分割函数,但没有一个函数给出我想要的使用python拆分数组中的元素,python,arrays,numpy,Python,Arrays,Numpy,我有一个大数组,其中一部分如下所示。在每个列表中,第一个数字是开始,第二个数字是结束(因此有一个范围)。我想做的是: 1: 过滤掉小于300的列表(范围)(例如,必须删除以下数组中的第18个列表) 2: 通过以下方式获得较小的范围(列表):(开始+100)到(开始+200)。e、 g第一个列表是[569669] 我尝试在numpy中使用不同的分割函数,但没有一个函数给出我想要的 array([[ 469, 1300], [ 171, 1440], [ 187, 156
array([[ 469, 1300],
[ 171, 1440],
[ 187, 1564],
[ 204, 1740],
[ 40, 1363],
[ 56, 1457],
[ 132, 606],
[1175, 2096],
[ 484, 2839],
[ 132, 4572],
[ 166, 1693],
[ 69, 3300],
[ 142, 1003],
[2118, 2118],
[ 715, 1687],
[ 301, 1006],
[ 48, 2142],
[ 63, 330],
[ 479, 2411]], dtype=uint32)
你们知道用python怎么做吗
谢谢
说明:
第一个命令使用内置方法根据表达式过滤其余元素
第二个循环遍历列表并在执行此操作时生成一个新的列表
如果输入和输出应为numpy数组,请尝试以下操作。注意:在不创建新数组的情况下,无法筛选numpy数组
data = array([
( 469, 1300),
( 171, 1440),
# ...
( 63, 330),
( 479, 2411)], dtype=(uint32, uint32))
print(
array(filter(lambda v: v[1] - v[0] >= 300, data), dtype=(uint32, uint32))
)
print(
array([[v[0] + 100, v[0] + 200] for v in data], dtype=(uint32, uint32))
)
之前的一般说明:
您应该使用来表示这些范围,而不是列表,它们是不可变的数据类型,对其中项目的顺序有意义
对于1,用python进行过滤非常容易:
filter(lambda single_range: single_range[1] - single_range[0] > 300, ranges)
(在我看来)一个更清晰的方法是通过列表理解:
[(start, end) for start, end in ranges if end - start > 300]
至于2,我不完全理解你的意思,但如果你的意思是创建一个新的范围列表,其中每个范围都使用单个函数进行更改,那么你是指一个映射(或者我喜欢的方式,一个相同但更具描述性的列表理解):
假设您的数组名为
A
,则:
import numpy as np
# Filter out differences not wanted
gt300 = A[(np.diff(A) >= 300).flatten()]
# Set new value of first column
gt300[:,0] += 100
# Set value of second column
gt300[:,1] = gt300[:,0] + 100
或者类似于:
B = A[:,0][(np.diff(A) >= 300).flatten()]
C = np.repeat(B, 2).reshape((len(B), 2)) + [100, 200]
我们可以找到哪些行与以下行之间的差异较小:
In [745]: mask=(x[:,1]-x[:,0])<300
In [746]: mask
Out[746]:
array([False, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, True, False], dtype=bool)
制作一套新的靶场;获取第一列;这里我使用的是[0]
,因此选择内容仍然是一个列数组:
In [750]: x[:,[0]]
Out[750]:
array([[ 469],
[ 171],
[ 187],
...
[ 48],
[ 63],
[ 479]], dtype=uint32)
将所需的偏移添加到该值。这充分利用了广播的优势
In [751]: x[:,[0]]+[100,200]
Out[751]:
array([[ 569, 669],
[ 271, 371],
[ 287, 387],
[ 304, 404],
[ 140, 240],
[ 156, 256],
...
[ 401, 501],
[ 148, 248],
[ 163, 263],
[ 579, 679]], dtype=int64)
构造这样一个数组还有其他方法
np.column_stack([x[:,0]+100,x[:,0]+200])
np.array([x[:,0]+100, x[:,0]+200]).T # or vstack
其他答案建议使用Python
列表filter
。我倾向于在这种用法中列出理解,例如:
In [756]: np.array([i for i in x if (i[1]-i[0])<300])
Out[756]:
array([[2118, 2118],
[ 63, 330]], dtype=uint32)
In[756]:np.array([i for i In x if(i[1]-i[0])过滤器应该很容易…Python有一个显式的过滤器函数Hi Simon,很好。它非常适合矩阵(列表列表列表),但我的数据是数组,我必须得到数组(即numpy数组)。您知道如何操作输入数组以获得类似numpy数组的输入,但要进行上述更改吗?嗨,埃胡德,这是一个numpy数组。我想获得相同的数组以进行进一步处理。嗨,乔恩,当我运行最后一行时,它会给出以下错误:“TypeError:列表索引必须是整数,而不是元组”@user3925736到底哪一行?
In [751]: x[:,[0]]+[100,200]
Out[751]:
array([[ 569, 669],
[ 271, 371],
[ 287, 387],
[ 304, 404],
[ 140, 240],
[ 156, 256],
...
[ 401, 501],
[ 148, 248],
[ 163, 263],
[ 579, 679]], dtype=int64)
np.column_stack([x[:,0]+100,x[:,0]+200])
np.array([x[:,0]+100, x[:,0]+200]).T # or vstack
In [756]: np.array([i for i in x if (i[1]-i[0])<300])
Out[756]:
array([[2118, 2118],
[ 63, 330]], dtype=uint32)