Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 如何将基本体列表附加到对象的numpy数组中_Python_Numpy - Fatal编程技术网

Python 如何将基本体列表附加到对象的numpy数组中

Python 如何将基本体列表附加到对象的numpy数组中,python,numpy,Python,Numpy,编辑:我已经得到了很多有用的反馈,关于如何不做这件事以及如何找到替代方案,但使之有用取决于我用例的特性,这会使这个问题对其他人不那么有用。在这一点上,我不是在寻找替代方法来使用这种结构的数据。我在寻找为什么在numpy做这件事似乎不可能(或者如果不是不可能的话怎么做) 我有一个numpy数组,看起来像 a = array([list([1]), list([4, 5])], dtype=object) 我想附加一个列表,如 b = [2, 3, 4] 得到这样的结果 array([list(

编辑:我已经得到了很多有用的反馈,关于如何不做这件事以及如何找到替代方案,但使之有用取决于我用例的特性,这会使这个问题对其他人不那么有用。在这一点上,我不是在寻找替代方法来使用这种结构的数据。我在寻找为什么在numpy做这件事似乎不可能(或者如果不是不可能的话怎么做)

我有一个numpy数组,看起来像

a = array([list([1]), list([4, 5])], dtype=object)
我想附加一个列表,如

b = [2, 3, 4]
得到这样的结果

array([list([1]), list([4, 5]), list([2, 3, 4])], dtype=object)
然而,我尝试过的每一种方法都产生了:

array([list([1]), list([4, 5]), 2, 3, 4], dtype=object)
我尝试了vstack、concatenate和append,以及将内容包装到列表或ndarray中

我为什么要这样做?基本上,我在一个数据库中有很多数据,这些数据将被输入sklearn。我想有一个3d ndarray(数据集x数据点x特征),但传入的数据是坏的,某些东西有不同的长度,所以最里面的维度必须是列表。我试图附加一个派生特性,但一直失败。我已经设法对操作进行了重新排序,以避免需要执行此追加操作,但我仍然想知道如何执行此操作。这对numpy来说似乎是一个奇怪的失败。
编辑:简而言之,外部数组必须是一个ndarray,因为它实际上是二维的,并且经常使用复杂的切片,而追加操作很少发生。

如果您确实必须使用
dtype=object
np.ndarray
,则可以执行以下操作:

a = np.array([list([1]), list([4, 5])], dtype=object)
b = [2, 3, 4]
a = np.hstack((a, np.empty(1)))
a[-1] = b
(当然,如果您完全导入了numpy,请删除
np.

但是我建议不要使用
dtype=object
np.ndarray
s。使用
list
s代替:

a = [[list([1]), list([4, 5])]]
b = [2, 3, 4]
a.append(b)
现在,如果您确实希望将
a
作为
np.ndarray
,那么可以执行以下操作:

a = np.array(a)

首先,附加到一个数组是一个昂贵且通常很难闻的操作。问题是数组的内容可能是可变的,但底层缓冲区的地址不是可变的。每次追加一个元素,整个过程都会被重新分配和复制。据我所知,甚至没有人试图摊销,比如说

如果您想采用稍微不同的方法,我建议您像现在一样将数据保存在
列表中。只要在实际需要数组时将列表转换为数组即可。请记住,这比每次重新分配到新阵列要便宜,而且与附件的数量相比,您可能不必经常这样做:

stack = [[1], [4, 5]]
a = np.array(stack, dtype=np.object)
# do stuff to the array

...

stack.append([2, 3, 4])
a = np.array(stack, dtype=np.object)
了解您的问题后立即更新

如果您的目标只是想知道如何将一个元素附加到一个对象数组中,而不必知道它是一个列表,那么您必须首先创建一个空的数组或元素。我建议只创建空元素并将它们显式地设置到列表中,而不是像一些注释所建议的那样尝试用假元素强制类型。如果希望有一个干净的接口,可以将操作包装在函数中

以下是一个例子:

b = [2, 3, 4]
c = np.empty(1, dtype=np.object)
c[0] = b
a = np.concatenate((a, c))


当然,这并不像
np.array([b],dtype=np.object)
那样清晰,但这只是numpy处理数组的一个产物。您必须这样做的原因是,numpy将列表或元组视为一个特殊项,您希望在外部级别将其转换为数组。

我可以通过a.append(“temp”);a[-1]=b,但这似乎有点陈腐和糟糕。感觉应该有办法做到这一点。在单行程序中,您可以这样做:
arr=np.array(a.tolist()+[b])
@brella,即使外部数据阵列是2d,也可以这样做。然而,我有点担心双转换的速度,因为这些数组实际上有数千个元素。这看起来也有点丑陋和不幸。我真的希望有一个numpy方法来实现这一点,或者解释一下内置的失败原因。“不过,我肯定会把这个作为一个答案,”欧文格雷说。附加到数组是个坏主意。不要担心黑客行为和成本。同意@MadPhysicast。如果您担心性能,请不要对长度不匹配的列表使用NumPy数组。如果必须,请使用填充并创建一个普通的
mxn
数组。这可能适用于许多情况,但在我的情况下,外部数组是二维的,而整体数据结构是三维的。我也只追加了一次,并多次按第二个索引进行切片。我认为这种方法对我不起作用。我还担心这种方法的效率:我认为list->ndarray转换至少是O(n)。我还编辑了我的问题,以澄清我更多的是想让这个问题对其他人有用,而不是试图找到处理我的情况的最佳方法。@OwenGray。我希望我的更新能回答你的实际问题。这里的更新回答了“为什么我不能”<代码>连接
连接数组。新工件必须位于正确的数据类型和形状-对象和(1,)的数组中。从
np开始。如果不是唯一的方法,空的
是最好的。@hpaulj。从技术上讲,你可以使用
np.zero
np.one
,但那只是浪费。对象空填充
None
,所以不像数字版本那么便宜。但我喜欢这样的填充。为什么会有反对票?这和@Mad的更新一样有效。还有一些事情,比如在一段时间(几天或几周)后无法接受正确的答案,因为出现了一些后续问题,这些问题在初始问题中没有描述,也与初始问题没有直接联系。比如说。我猜是因为你给出的第一个解决方案已经在我对这个问题的评论中了(在你回答之前),而你提出的另一个选择是非常明显的。不,那不是真的。您确实意识到,您在第一个示例中提供的解决方案会引发
AttributeErro
a = np.append(a, c)