data = load('data.npy')
def split_classes(data,col):
newdata = []
nclasses = len(unique(data[:,col]))
classes = [[]] * nclasses
for row in data:
classes[int(row[col])].append(copy(row))
print(len(classes[0]),len(classes[1]),len(data))
return classes
split_classes(data,-1)
这并没有达到我想要的效果。值被添加到 python 数组中的每个列表中。这种情况下的输出是: 200 200 200
Example:
Input:
[[4, 2, 0]
[3, 1, 0]
[5, 9, 1]]
Output:
[[4, 2, 0],[3, 1, 0]],[5, 9, 1]]
最佳答案
当您在 Python 中使用语法 [[]] * nclasses
时,并不意味着您会获得 nclasses
个不同的空列表对象。这意味着您将获得一个长度为 nclasses 的列表,其中每个元素都是同一个空列表的句柄。如果其中一个经历追加操作,那么他们都会经历追加操作。
相反,您可以尝试[[] for i in range(nclasses)]
。您可以检查 classes
的不同元素的 id
,以验证它们确实具有不同的对象 id。
考虑一个较小的例子:
In [6]: x = [[] for i in range(3)]
In [7]: map(id, x)
Out[7]: [139882701328328, 139882701358288, 139882701358360]
In [8]: x[0].append(1)
In [9]: x
Out[9]: [[1], [], []]
In [10]: y = [[]] * 3
In [11]: y[0].append(1)
In [12]: y
Out[12]: [[1], [1], [1]]
In [13]: map(id, y)
Out[13]: [139882701358216, 139882701358216, 139882701358216]
关于python - Numpy 附加到 python 列表的两个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28665585/