Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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拆分数组中的元素_Python_Arrays_Numpy - Fatal编程技术网

使用python拆分数组中的元素

使用python拆分数组中的元素,python,arrays,numpy,Python,Arrays,Numpy,我有一个大数组,其中一部分如下所示。在每个列表中,第一个数字是开始,第二个数字是结束(因此有一个范围)。我想做的是: 1: 过滤掉小于300的列表(范围)(例如,必须删除以下数组中的第18个列表) 2: 通过以下方式获得较小的范围(列表):(开始+100)到(开始+200)。e、 g第一个列表是[569669] 我尝试在numpy中使用不同的分割函数,但没有一个函数给出我想要的 array([[ 469, 1300], [ 171, 1440], [ 187, 156

我有一个大数组,其中一部分如下所示。在每个列表中,第一个数字是开始,第二个数字是结束(因此有一个范围)。我想做的是:

1: 过滤掉小于300的列表(范围)(例如,必须删除以下数组中的第18个列表)

2: 通过以下方式获得较小的范围(列表):(开始+100)到(开始+200)。e、 g第一个列表是[569669]

我尝试在numpy中使用不同的分割函数,但没有一个函数给出我想要的

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)