Py学习  »  Python

用Numpy Python编写数组

georgehere • 3 年前 • 1194 次点击  

我怎样才能编写一个代码来格式化 [a,b,c] 值,并将负值变为零。映射lambda函数 formater 按预期工作,但我在for循环中重写数组。下面的代码不起作用。如何获得预期的输出?

import numpy as np 

a = np.array([2323,34,12,-23,12,4,-33,-2,-1,11,-2])
b = np.array([12,-23-1,-1,-3,-12])
c = np.array([23,45,3,13,-1992,5])

format_number = lambda n: n if n % 1 else int(n)
for count,formater in enumerate([a, b, c]):
    formater = list(map(lambda n: 0 if n < 0 else format_number(n), formater))
    formater[count]= formater

输出:

[2323   34   12  -23   12    4  -33   -2   -1   11   -2]
[ 12 -24  -1  -3 -12]
[   23    45     3    13 -1992     5]

预期产出:

[2323, 34, 12, 0, 12, 4, 0, 0, 0, 11, 0]
[12, 0, 0, 0, 0]
[23, 45, 3, 13, 0, 5]
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129825
 
1194 次点击  
文章 [ 2 ]  |  最新文章 3 年前
hpaulj
Reply   •   1 楼
hpaulj    3 年前

你要做的应该是列表和数组。

In [163]: a = [2323,34,12,-23,12,4,-33,-2,-1,11,-2]
     ...: b = [12,-23-1,-1,-3,-12]
     ...: c = np.array([23,45,3,13,-1992,5])

收集列表中的变量:

In [164]: alist = [a,b,c]
In [165]: alist
Out[165]: 
[[2323, 34, 12, -23, 12, 4, -33, -2, -1, 11, -2],
 [12, -24, -1, -3, -12],
 array([   23,    45,     3,    13, -1992,     5])]

如果我像你一样迭代,并给 item ,没有任何变化 alist .

In [166]: for item in alist:
     ...:     item = [1,2,3]
     ...: 
In [167]: alist
Out[167]: 
[[2323, 34, 12, -23, 12, 4, -33, -2, -1, 11, -2],
 [12, -24, -1, -3, -12],
 array([   23,    45,     3,    13, -1992,     5])]

这是至关重要的;在遍历列表时,不能替换迭代变量;否则,您将失去与源的连接。

相反,我们修改了 项目 ,将其更改到位。

In [168]: for item in alist:
     ...:     for i,v in enumerate(item):
     ...:         if v<0:
     ...:             item[i] = 0
     ...: 
     ...: 

现在,更改出现在列表中:

In [169]: alist
Out[169]: 
[[2323, 34, 12, 0, 12, 4, 0, 0, 0, 11, 0],
 [12, 0, 0, 0, 0],
 array([23, 45,  3, 13,  0,  5])]

验证这是否已更改原始列表/阵列:

In [170]: a
Out[170]: [2323, 34, 12, 0, 12, 4, 0, 0, 0, 11, 0]

让我们尝试一些更接近您的代码的东西:

In [171]: format_number = lambda n: n if n % 1 else int(n)
In [174]: formater = [2323,34,12,-23,12,4,-33,-2,-1,11,-2]
In [175]: new = list(map(lambda n: 0 if n < 0 else format_number(n), formater))
In [176]: new
Out[176]: [2323, 34, 12, 0, 12, 4, 0, 0, 0, 11, 0]

使用列表(map())我创建了一个新列表。如果你想在循环中使用这个,就像我在 项目 ,我必须修改原文。

In [177]: formater[:] = new
In [178]: formater
Out[178]: [2323, 34, 12, 0, 12, 4, 0, 0, 0, 11, 0]

将其应用于原始变量:

In [179]: a = [2323,34,12,-23,12,4,-33,-2,-1,11,-2]
     ...: b = [12,-23-1,-1,-3,-12]
     ...: c = np.array([23,45,3,13,-1992,5])
In [180]: alist = [a,b,c]
In [181]: for item in alist:
     ...:     item[:]=list(map(lambda n: 0 if n < 0 else format_number(n), item))
     ...: 
In [182]: alist
Out[182]: 
[[2323, 34, 12, 0, 12, 4, 0, 0, 0, 11, 0],
 [12, 0, 0, 0, 0],
 array([23, 45,  3, 13,  0,  5])]
U12-Forward
Reply   •   2 楼
U12-Forward    3 年前

这样比较好 np.vectorize :

format_number = lambda n: n if n % 1 else int(n)
for count, formater in enumerate([a, b, c]):
    formater[formater < 0] = 0
    formatter = np.vectorize(format_number)(formater)
    print(formater.tolist())

要修复代码,请执行以下操作:

format_number = lambda n: n if n % 1 else int(n)
for count,formater in enumerate([a, b, c]):
    formater = list(map(lambda n: 0 if n < 0 else format_number(n), formater))
    print(formater)

两种输出:

[2323, 34, 12, 0, 12, 4, 0, 0, 0, 11, 0]
[12, 0, 0, 0, 0]
[23, 45, 3, 13, 0, 5]