Python Can';t更改numpy数组中的值

Python Can';t更改numpy数组中的值,python,numpy,numpy-ndarray,Python,Numpy,Numpy Ndarray,我有一些代码,通过查看它应该可以完美地工作 def upc_dict_to_pandas_dataframe(upc_dict): #This could be done in fewer lines but I split them for debugging purposes d = upc_dict.items() d = list(d) d = [list(i) for i in d] for i in range(len(d)):

我有一些代码,通过查看它应该可以完美地工作

def upc_dict_to_pandas_dataframe(upc_dict):
    #This could be done in fewer lines but I split them for debugging purposes
    d = upc_dict.items()
    d = list(d)
    d = [list(i) for i in d]

    for i in range(len(d)):
        d[i] = np.array(d[i], dtype=object)
        d[i] = np.hstack(d[i])
        x = int(d[i][3])
        d[i][3] = x
最后一行d[i][3]=x没有将x分配给d[i][3]。它的原始类型是一个numpy字符串,我试图用它的整数形式替换它。然而,它似乎完全跳过了作业线。我甚至在调试模式下尝试过。我看着它把字符串数字转换成整数。但d[i][3]从未改变

这是为什么?我如何修复它

先谢谢你

编辑

这是d=[d中的i的列表(i)]之后的d值

<class 'list'>: [['B01A8L6KKO', ['873124006834', 'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL', 4408]], ['B00L59D9HG', ['045496891503', 'Nintendo 3DS AC Adapter', 148]], ['B00ND0EBP4', ['873124005110', 'HORI Retro Zelda Hard Pouch for Nintendo 3DS XL - Zelda Version Edition', 4403]], ['B01MSHC8WT', ['859986005680', 'Tend Insights John Deere 100 Indoor Wi-Fi Camera', 16007]], ['B07CFLK37X', ['859986005291', 'Lynx Indoor/Outdoor Pro HD Wifi Camera', -1]], ['B076ZWVR2R', ['859986005376', 'Lynx Solar Weatherproof Outdoor WiFi Surveillance Camera with Solar Panel, Facial Recognition, Night Vision, White', 23570]], ['B0716ZNTKS', ['859986005857', 'Tend Insights Minion Cam HD Wi-Fi Camera (Despicable Me 3', 17726]], ['B00MOVY01I', ['853376004284', 'Rocksteady XS Extra Battery and Charger', -1]]]
 _len_ = 8
:['B01A8L6KKO',['873124006834','HORI Premium Protector-Pikachu Edition for Nintendo New 2DS XL',4408],['B00L59D9HG',['045496891503','Nintendo 3DS AC Adapter',148],['B00ND0EBP4',['873124005110','HORI Retro Zelda Hard Pocket for Nintendo 3DS XL-Zelda Edition',4403],['B01MSHC8WT'],['859986005680','Tend Insights John Deere 100室内Wi-Fi摄像头',16007],['B07CFLK37X',['859986005291','Lynx室内/室外专业高清Wifi摄像头',-1],['B076ZWVR2R',['859986005376',Lynx太阳能防风雨室外Wifi监控摄像头,带太阳能电池板,面部识别,夜视,白色',['B0716ZNTKS',['859986005857','Tend Insights Minion Cam高清Wi-Fi摄像头(卑鄙的Me 3',17726],['B00MOVY01I',['853376004284','Rockstaid XS额外电池和充电器',-1]]
_透镜=8

我刚刚想出了一个快速解决方案:

更改此行:

d[i] = np.hstack(d[i])
为此:

d[i] = list(np.hstack(d[i]))

我认为这个问题是numpy特有的。我仍然很好奇为什么它不适用于numpy。

我刚刚想出了一个快速解决方案:

更改此行:

d[i] = np.hstack(d[i])
为此:

d[i] = list(np.hstack(d[i]))

我认为这个问题是numpy特有的。我仍然很好奇为什么它不能与numpy一起工作。

要能够调用
d[I][3]
这似乎是一个嵌套列表并使用hstack,您需要将
d[I]
列表放在嵌套列表中。您可以在上阅读更多信息

因此,
list(np.hstack(d[i]))
将数组转换为嵌套列表形式。 您可以自己执行一个简单的脚本,并且可以看到
np.array()
实际上并没有返回嵌套列表表单,因为它本身已经在数组表单中

import numpy as np

a = np.array([1,2,3])
print(np.array(a))

# outputs [1,2,3]

要能够调用似乎是嵌套列表的
d[i][3]
并使用hstack,您需要将
d[i]
列表置于嵌套列表中。您可以在中阅读更多信息

因此,
list(np.hstack(d[i]))
将数组转换为嵌套列表形式。 您可以自己执行一个简单的脚本,并且可以看到
np.array()
实际上并没有返回嵌套列表表单,因为它本身已经在数组表单中

import numpy as np

a = np.array([1,2,3])
print(np.array(a))

# outputs [1,2,3]

使用您添加的
d

In [28]: d[0]                                                                                                
Out[28]: 
['B01A8L6KKO',
 ['873124006834',
  'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
  4408]]
In [29]: np.array(d[0], object)                                                                              
Out[29]: 
array(['B01A8L6KKO',
       list(['873124006834', 'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL', 4408])],
      dtype=object)
In [30]: np.hstack(np.array(d[0], object))                                                                   
Out[30]: 
array(['B01A8L6KKO', '873124006834',
       'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
       '4408'], dtype='<U64')
分配给此数组的任何内容都将转换为字符串

In [34]: x = np.hstack(np.array(d[0], object))                                                               
In [35]: x[3] = 123                                                                                          
In [36]: x                                                                                                   
Out[36]: 
array(['B01A8L6KKO', '873124006834',
       'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
       '123'], dtype='<U64')
hstack
确保所有输入都是数组,然后再将它们传递到
串联

In [49]: [np.atleast_1d(x) for x in d[0]]                                                                    
Out[49]: 
[array(['B01A8L6KKO'], dtype='<U10'), array(['873124006834',
        'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
        '4408'], dtype='<U64')]
tolist
通常更适合于从数组生成列表,尽管在这里没有多大区别:
np.hstack(d[0]).tolist()

另一种平展列表的方法是:

In [62]: x = np.hstack([np.array(j, object) for j in d[0]])                                                  
In [63]: x                                                                                                   
Out[63]: 
array(['B01A8L6KKO', '873124006834',
       'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
       4408], dtype=object)
x[3]
仍然是一个整数

但您也可以直接展平列表(因为它们都由字符串和列表组成):


使用您添加的
d

In [28]: d[0]                                                                                                
Out[28]: 
['B01A8L6KKO',
 ['873124006834',
  'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
  4408]]
In [29]: np.array(d[0], object)                                                                              
Out[29]: 
array(['B01A8L6KKO',
       list(['873124006834', 'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL', 4408])],
      dtype=object)
In [30]: np.hstack(np.array(d[0], object))                                                                   
Out[30]: 
array(['B01A8L6KKO', '873124006834',
       'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
       '4408'], dtype='<U64')
分配给此数组的任何内容都将转换为字符串

In [34]: x = np.hstack(np.array(d[0], object))                                                               
In [35]: x[3] = 123                                                                                          
In [36]: x                                                                                                   
Out[36]: 
array(['B01A8L6KKO', '873124006834',
       'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
       '123'], dtype='<U64')
hstack
确保所有输入都是数组,然后再将它们传递到
串联

In [49]: [np.atleast_1d(x) for x in d[0]]                                                                    
Out[49]: 
[array(['B01A8L6KKO'], dtype='<U10'), array(['873124006834',
        'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
        '4408'], dtype='<U64')]
tolist
通常更适合于从数组生成列表,尽管在这里没有多大区别:
np.hstack(d[0]).tolist()

另一种平展列表的方法是:

In [62]: x = np.hstack([np.array(j, object) for j in d[0]])                                                  
In [63]: x                                                                                                   
Out[63]: 
array(['B01A8L6KKO', '873124006834',
       'HORI Premium Protector - Pikachu Edition for Nintendo New 2DS XL',
       4408], dtype=object)
x[3]
仍然是一个整数

但您也可以直接展平列表(因为它们都由字符串和列表组成):


如果您能在最初的几步中展示
d
是什么,这会有所帮助。它似乎是一个列表列表,但内部列表包含的内容较少。如果不看您如何调用函数,很难判断发生了什么。@hpaulj。它似乎是一个字典,变成了一个两列列表。同样,它也会混淆sing.看起来numpy在这里真的没有任何意义。你能从概念上解释一下你在做什么吗?如果
array(['1','100','021'],dtype='如果您能在最初的几步中展示
d
是什么,这会有所帮助。它似乎是一个列表列表,但内部列表所包含的内容较少。如果不知道如何调用函数,就很难判断发生了什么。@hpaulj.它似乎是一个字典,变成了一个两列列表。不,less令人困惑。看起来numpy在这里真的没有任何用途。你能从概念上解释一下你在做什么吗?如果
array(['1','100','021',,dtype='噢,我明白了。所以d[I]中的内容必须有一个列表来容纳它们才能将其展平。谢谢你清理这个问题!非常奇怪的异常,但现在我知道:)哦,我明白了。所以d[I]中的内容必须有一个列表来保存它们,以便将其展平。感谢您清理这些内容!非常奇怪的异常,但现在我知道:)