python - Numpy 附加到 python 列表的两个元素

标签 python numpy

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/

相关文章:

python - 如何从我的菜单 UI 中删除虚线?

python - 使用广播根据向量中的元素乘以矩阵行?

python - 将数千张图像读入一个大 numpy 数组的最快方法

python - 在 Python 中实现 MATLAB 的 im2col 'sliding'

c++ - 无法在 boost-python 中导入 numpy

python - 仍然无法安装自动登录 - TLSV1_ALERT_PROTOCOL_VERSION

python - 如何按顺序循环/解析表行而不跳到变量的下一个实例?

python - 来自图像 : OCR-Python 的验证码中断或文本阅读器

python - 比较两组字符串,返回不同的结果

python - 重复 numpy 值并指定 dtype