我有一个大数组,其中一部分显示在下面的小例子中。 在每个列表中,第一个数字是开始,第二个数字是结束 (所以有一个范围)但每个元素都是一个序列的一部分 每个序列从零开始。 。我想做的是:
小例子:
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)
我想从每个被索引为0的序列开始 (不包括在范围内)直到-20之前 每个范围的开始。
我试过这段代码:
cds = np.column_stack([cdspos[:, 0] - cdspos[:, 0], cdspos[:, 0] - 20])
但它会出现此错误:
y = _nx.arange(0, num, dtype=dt)
MemoryError
但我试试这个:
cds = np.column_stack([cdspos[:, 0] - 100, cdspos[:, 0] - 20])
它完美无缺。问题是我没有相同的范围 在起点之前(所有这些都不是100)。
所以,我希望得到一个更小的范围(列表):(0)到 (开始-20)。例如,第一个元素是这样的:
[ 0, 449]
我也试过
cds = np.column_stack([0, cdspos[:, 0] - 20])
但没有用。
对于小例子,我正在寻找的输出将是这样的:
array([[0, 449],
[0, 151],
[0, 167],
[0, 184],
[0, 20],
[0, 36],
[0, 112],
[0, 1155],
[0, 464],
[0, 112],
[0, 146],
[0, 49],
[0, 122],
[0, 2098],
[0, 695],
[0, 281],
[0, 28],
[0, 43],
[0, 459]], dtype=uint32)
你知道怎么做吗?
答案 0 :(得分:0)
这是一种方式:
In [22]: np.column_stack((np.zeros(a.shape[0], dtype=np.int8), (a[:,0]- 20).astype(np.int16)))
Out[22]:
array([[ 0, 449],
[ 0, 151],
[ 0, 167],
[ 0, 184],
[ 0, 20],
[ 0, 36],
[ 0, 112],
[ 0, 1155],
[ 0, 464],
[ 0, 112],
[ 0, 146],
[ 0, 49],
[ 0, 122],
[ 0, 2098],
[ 0, 695],
[ 0, 281],
[ 0, 28],
[ 0, 43],
[ 0, 459]], dtype=int16)
请注意,在这种情况下,我使用np.int8
表示零和np.int16
(如果您的数字大于np.uint32
,请使用int16
)表示第二列数。如果再次出现内存错误,则意味着您无法在RAM中同时保留阵列。您可以将阵列分成多个部分,并分别对不同部分应用操作,也可以单独处理。如果这是不可能的
答案 1 :(得分:0)
怎么样?
In [17]: numpy.array([[0, start -20] for start, end in a], dtype=numpy.uint32)
Out[17]:
array([[ 0, 449],
[ 0, 151],
[ 0, 167],
[ 0, 184],
[ 0, 20],
[ 0, 36],
[ 0, 112],
[ 0, 1155],
[ 0, 464],
[ 0, 112],
[ 0, 146],
[ 0, 49],
[ 0, 122],
[ 0, 2098],
[ 0, 695],
[ 0, 281],
[ 0, 28],
[ 0, 43],
[ 0, 459]], dtype=uint32)