在方法中修改numpy数组的Python列表,而不传递整个列表
我有一个标准的numpy数组列表,因为每个项目的维度数量不相等,我将其转换为uint8(大量十六进制值),然后执行操作以规范化每个numpy数组的维度,这样我就可以将其从列表转换为多维numpy数组 为了实现这一点,我需要使用一些方法使代码可读,但当我将列表中的一个numpy数组传递给一个方法时,我还必须传递整个列表和迭代器:在方法中修改numpy数组的Python列表,而不传递整个列表,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有一个标准的numpy数组列表,因为每个项目的维度数量不相等,我将其转换为uint8(大量十六进制值),然后执行操作以规范化每个numpy数组的维度,这样我就可以将其从列表转换为多维numpy数组 为了实现这一点,我需要使用一些方法使代码可读,但当我将列表中的一个numpy数组传递给一个方法时,我还必须传递整个列表和迭代器: def push_bytes(messages, message, start_byte, i): messages[i] = np.insert
def push_bytes(messages, message, start_byte, i):
messages[i] = np.insert(messages[1], start_byte, 0, 0)
我多次调用此方法,因此我不想传递整个列表和迭代器,这样我可以执行以下操作:
def push_bytes(message, start_byte):
message = np.insert(message, start_byte, 0, 0)
我相信这不起作用的原因是因为message=
正在创建一个新的numpy数组,而不是指向原始数组,有没有一种方法可以指向原始数组而不必传递整个列表和迭代器
样本数据:
messages = [
[ 5 1 0 0 0 47 69 222 10 221 242 132 0 0 0 79 0 0 ]
[ 5 1 0 0 0 27 68 222 10 86 7 133 95 126 220 38 0 ]
[ 5 1 0 0 45 48 0 0 7 10 86 7 133 95 126 220 30 0 0 0 79 0 0 ]
[ 5 1 0 0 0 47 69 222 10 129 10 133 95 126 220 5 0 0 0 75 0 0 ]
[ 5 1 0 0 17 39 0 0 112 66 222 10 129 10 133 ]
[ 5 1 0 0 7 69 222 10 138 0 0 55 0 0 0 79 0 0 ]
[ 5 222 10 138 10 133 95 126 0 0 24 0 0 0 79 0 0 ]
[ 17 39 0 0 232 66 222 10 138 10 133 0 0 0 0 0 93 0 0 ]
]
类似于以下的函数:
def push_bytes(messages, i, start_byte):
messages[i] = np.insert(messages[i], start_byte, 0, 0)
将修改(实际替换)消息列表中的第i个元素。正在传递的是对列表的引用。没有复制或其他昂贵的东西
np.insert
函数确实创建了一个新数组,并在消息
列表中放置了对该数组的引用
在:
message=…
将新数组分配给message
变量,但它是一个局部变量,并且不会修改函数外部的变量。您必须添加一个
return message
做
messages[i] = push_bytes(messages[i], start_byte)
修改消息
列表的元素
我认为这两个函数的执行时间相似,因为它们只传递引用,不需要不同的计算或拷贝。第二个是,在大多数情况下,更干净,因为它不假设任何关于
消息的内容;它只是创建新的数组(我想这不仅仅是对np.insert
)的简单调用。您能提供一些示例数据吗?另外,什么是count
?。insert
创建一个新数组-push_bytes
没有理由负责修改原始列表。实际上,可能根本没有理由修改原始列表。类似于new_list=[push_bytes(…)for…in…][/code>的方法更有意义,因为push_bytes
返回新数组。@markmoreto我编辑了问题并删除了计数,我使用的实际方法要复杂得多,在某个位置插入给定数量的字节,这使用循环来完成。我将添加示例数据yes@user2357112supportsMonica我会这么做,但我在多核上处理大量数据,不幸的是,在列表中加倍使用太多内存。非常感谢,是的,这更干净了。很高兴听到它只是传递引用而不是复制,我是python新手,对此不确定。我希望Python或NoMPy中有一些内置的东西,在这里你可以传递C++的实际地址和撤销引用。到目前为止,我很喜欢python,但我想这种类型的东西是该语言的缺点。我发现了另一个问题,它展示了一种解决方法:但结论是它太麻烦了,返回值更好。它也有很多关于引擎盖下发生的事情的不同答案中的更多信息。
messages[i] = push_bytes(messages[i], start_byte)