Python np.append不适用于numpy.ndarray类型的字典值

2024-04-20 06:27:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,给定两个numpy数组,将它们转换成一个dictionary,如下所示

def seggregate_based_on_y(X,y):
    dictionary={}
    for index in range(len(y)):
        if y[index] in dictionary.keys():
            np.append(dictionary[y[index]],X[index])
        else:
            dictionary[y[index]]=np.array([X[index]])
    return dictionary

对于以下输入

X=np.array([[1,1],[2,2],[3,3],[4,4],[5,5]])
y=np.array([2,3,2,3,4])
d=seggregate_based_on_y(X,y)
print(d)

我希望'd'是{2: array([[1, 1],[3,3]]), 3: array([[2, 2],[4,4]]), 4: array([[5, 5]])},但我得到的'd'是{2: array([[1, 1]]), 3: array([[2, 2]]), 4: array([[5, 5]])},这是if语句不起作用。应该怎么做


Tags: 函数innumpyforindexdictionaryifon
3条回答

试试这个

import numpy as np

def seggregate_based_on_y(X,y):
    dictionary={}
    for index in range(len(y)):
        if y[index] in dictionary.keys():
            z = np.append(dictionary[y[index]], X[index])
            dictionary[y[index]] = z.reshape(z.size // 2, 2)

        else:
            dictionary[y[index]]=np.array([X[index]])
    return dictionary

X=np.array([[1,1],[2,2],[3,3],[4,4],[5,5]])
y=np.array([2,3,2,3,4])
d=seggregate_based_on_y(X,y)
print(d)

输出:

{2: array([[1, 1],[3, 3]]), 3: array([[2, 2],[4, 4]]), 4: array([[5, 5]])}

您可以使用内置函数zip

def seggregate_based_on_y(X,y):
    d = {}
    for k, v in zip(y, X):
        if k in d:
            d[k] = np.append(d[k], v.reshape(1, 2), axis=0)
        else:
            d[k] = v.reshape(1, 2)

    return d


X=np.array([[1,1],[2,2],[3,3],[4,4],[5,5]])
y=np.array([2,3,2,3,4])
print(seggregate_based_on_y(X,y))

输出:

{2: array([[1, 1],
        [3, 3]]), 3: array([[2, 2],
        [4, 4]]), 4: array([[5, 5]])}

首先,正如评论所说,您必须为字典分配新值。请参阅以下修复程序:

def seggregate_based_on_y(X,y):
    dictionary={}
    for index in range(len(y)):
        if y[index] in dictionary.keys():
            dictionary[y[index]] = np.append(dictionary[y[index]],X[index])
        else:
            dictionary[y[index]]=np.array([X[index]])
    return dictionary

根据给定的数据输出:

{2: array([1, 1, 3, 3]), 3: array([2, 2, 4, 4]), 4: array([[5, 5]])}

这与预期结果不同,因为np.append将附加到同一个向量。要获得所需的输出,请使用np.vstack

def seggregate_based_on_y(X,y):
    dictionary={}
    for index in range(len(y)):
        if y[index] in dictionary.keys():
            dictionary[y[index]] = np.vstack((dictionary[y[index]],X[index]))
        else:
            dictionary[y[index]]=np.array([X[index]])
    return dictionary

这里的输出是:

{2: array([[1, 1],
       [3, 3]]), 3: array([[2, 2],
       [4, 4]]), 4: array([[5, 5]])}

我希望这有帮助

相关问题 更多 >