不创建新数组的结构化数组的Numpy.trim_零

不创建新数组的结构化数组的Numpy.trim_零,numpy,Numpy,是否可以在不复制的情况下修剪结构化numpy数组的零“记录”;i、 e.在开始或结束时为“未使用的”零项释放分配的内存;实际上,我只对最后的零感兴趣 1d阵列有一个内置函数。其返回值: 返回: 修剪:1-D数组或序列 修剪输入的结果。将保留输入数据类型 但是,我不能从中判断这是否不创建副本,而只是释放内存。我不够熟练,无法从其源代码看出其行为 更具体地说,我有以下代码: import numpy edges = numpy.zeros(3, dtype=[('i', 'i4'), ('j', '

是否可以在不复制的情况下修剪结构化numpy数组的零“记录”;i、 e.在开始或结束时为“未使用的”零项释放分配的内存;实际上,我只对最后的零感兴趣

1d阵列有一个内置函数。其返回值:

返回:

修剪:1-D数组或序列

修剪输入的结果。将保留输入数据类型

但是,我不能从中判断这是否不创建副本,而只是释放内存。我不够熟练,无法从其源代码看出其行为

更具体地说,我有以下代码:

import numpy
edges = numpy.zeros(3, dtype=[('i', 'i4'), ('j', 'i4'), ('length', 'f4')])
# fill the first two records with sensible data:
edges[0]['i'] = 0
edges[0]['j'] = 1
edges[0]['length'] = 2.0
edges[1]['i'] = 1
edges[1]['j'] = 2
edges[1]['length'] = 2.0
# list memory adress and size
edges.__array_interface__
edges = numpy.trim_zeros(edges)  # does not work for structured array
edges.__array_interface__
更新

我的问题有点“双重性”:

1) 内置函数只是释放内存还是复制阵列

答:它复制并创建一个切片(=视图)<代码>[ipython控制台]导入numpy;numpy???(另请参见和)

2) 什么样的解决方案可以为结构化阵列提供类似的功能

答复:


嗯,有两个问题

  • 首先,
    trim_zeros
    函数不能识别复合数据类型上的零
您可以通过
begin=(edges!=zero(1,edges.dtype)).argmax()找到它们。
end=len(edges)-(edges!=zero(1,edges.dtype))[::-1].argmax()。然后,
goodedges=edges[begin:end]
是相互测试数据

  • 其次,
    trim_zeros
    功能不会释放内存:
返回------- 修剪:1-D数组或序列。 修剪输入的结果。将保留输入数据类型


所以我认为您必须手动执行:
goodedges=edges[begin:end].copy();删除边

IMHO,有两个问题

  • 首先,
    trim_zeros
    函数不能识别复合数据类型上的零
您可以通过
begin=(edges!=zero(1,edges.dtype)).argmax()找到它们。
end=len(edges)-(edges!=zero(1,edges.dtype))[::-1].argmax()。然后,
goodedges=edges[begin:end]
是相互测试数据

  • 其次,
    trim_zeros
    功能不会释放内存:
返回------- 修剪:1-D数组或序列。 修剪输入的结果。将保留输入数据类型


所以我认为您必须手动执行:
goodedges=edges[begin:end].copy();删除边

要扩展我的评论,让我们在一个简单的整数数组上尝试
trim_zero

In [252]: arr = np.zeros(10,int)
In [253]: arr[3:8]=np.ones(5)
In [254]: arr
Out[254]: array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0])
In [255]: arr1=np.trim_zeros(arr)
In [256]: arr1
Out[256]: array([1, 1, 1, 1, 1])
现在比较
\uuuu数组\u接口\uuuuu
字典:

In [257]: arr.__array_interface__
Out[257]: 
{'descr': [('', '<i4')],
 'shape': (10,),
 'version': 3,
 'strides': None,
 'data': (150760432, False),
 'typestr': '<i4'}

In [258]: arr1.__array_interface__
Out[258]: 
{'descr': [('', '<i4')],
 'shape': (5,),
 'version': 3,
 'strides': None,
 'data': (150760444, False),
 'typestr': '<i4'}
工作在最后一行,并明确返回一个切片,一个视图。大多数代码处理两个修剪选项(F和B)。请注意,它使用迭代查找
第一个
最后一个
非零。对于在开始或结束时只有几个额外0的阵列来说,这应该很好。但这并不是问题经常寻求的“矢量化”操作

在提出这个问题之前,我甚至不知道有
trim_zero
存在,但我对它的代码和行为一点也不感到惊讶

在一个次要问题上,这里有一种更简洁的方法来创建
数组

In [259]: edges =np.zeros(3, dtype=[('i', 'i4'), ('j', 'i4'), ('length', 'f4')])
In [260]: edges[:2]=[(0,1,2.0),(1,2,2.0)]
要删除所有
zero
元素,只需使用:

edges[edges!=numpy.zeros(1,edges.dtype)]
这是一本。它也会删除“嵌入的”零,但如果在填充之前的插槽后,只剩下最后的零,那么这可能不是问题

如果在列表中收集
数据,并在末尾构建数组,则可能根本不需要此修剪:

edges1 = np.array([(0,1,2.0),(1,2,2.0)], dtype=edges.dtype)

为了扩展我的评论,让我们在一个简单的整数数组上尝试
trim_zero

In [252]: arr = np.zeros(10,int)
In [253]: arr[3:8]=np.ones(5)
In [254]: arr
Out[254]: array([0, 0, 0, 1, 1, 1, 1, 1, 0, 0])
In [255]: arr1=np.trim_zeros(arr)
In [256]: arr1
Out[256]: array([1, 1, 1, 1, 1])
现在比较
\uuuu数组\u接口\uuuuu
字典:

In [257]: arr.__array_interface__
Out[257]: 
{'descr': [('', '<i4')],
 'shape': (10,),
 'version': 3,
 'strides': None,
 'data': (150760432, False),
 'typestr': '<i4'}

In [258]: arr1.__array_interface__
Out[258]: 
{'descr': [('', '<i4')],
 'shape': (5,),
 'version': 3,
 'strides': None,
 'data': (150760444, False),
 'typestr': '<i4'}
工作在最后一行,并明确返回一个切片,一个视图。大多数代码处理两个修剪选项(F和B)。请注意,它使用迭代查找
第一个
最后一个
非零。对于在开始或结束时只有几个额外0的阵列来说,这应该很好。但这并不是问题经常寻求的“矢量化”操作

在提出这个问题之前,我甚至不知道有
trim_zero
存在,但我对它的代码和行为一点也不感到惊讶

在一个次要问题上,这里有一种更简洁的方法来创建
数组

In [259]: edges =np.zeros(3, dtype=[('i', 'i4'), ('j', 'i4'), ('length', 'f4')])
In [260]: edges[:2]=[(0,1,2.0),(1,2,2.0)]
要删除所有
zero
元素,只需使用:

edges[edges!=numpy.zeros(1,edges.dtype)]
这是一本。它也会删除“嵌入的”零,但如果在填充之前的插槽后,只剩下最后的零,那么这可能不是问题

如果在列表中收集
数据,并在末尾构建数组,则可能根本不需要此修剪:

edges1 = np.array([(0,1,2.0),(1,2,2.0)], dtype=edges.dtype)

此函数对常规1d阵列有何作用?它复制了吗?返回视图?尝试两种
fb
。我无法想象它会改变缓冲区的大小。你能读懂它的代码吗?这个函数对常规1d数组有什么作用?它复制了吗?返回视图?尝试两种
fb
。我无法想象它会改变缓冲区的大小。你能读懂它的代码吗?谢谢你的回答。你的第一颗子弹,解决了我问题的一部分。然而,第二个问题实际上是我想要避免的:复制和释放。你认为
numpy.resize()
有什么帮助吗?没有,
resize
复制。IMHO,你唯一的机会就是按块收集数据,只存储有效的数据。谢谢你的回答。你的第一颗子弹,解决了我问题的一部分。然而,第二个问题实际上是我想要避免的:复制和释放。你认为
numpy.resize()
有什么帮助吗?没有,
resize
复制。IMHO,你唯一的机会就是按块收集数据,只存储有效的数据。@hapulj:谢谢你的回答。我不知道
。非常有用。在t