下面,我尝试读取文件并每隔第二和第三行存储一次。
我有4000行,但是有4行重复1000次的模式。
在阅读并将行分成三个变量x,y,z
之后。但是这些是字符串变量。下一个for循环,我试图将列表转换为numpy数组。为此,我使用字典。但是,在我打印代码的末尾,y
的类型仍然是str
变量。据我了解,尽管我循环了p
y
存储为x,y,z
。
#!/usr/bin/env python
import numpy as np
import matplotlib.pyplot as plt
fl = open('input.sis','r')
lines = []
x = []
y = []
z = []
for i in range(1000):
line = []
for j in range(4):
f= fl.readline()
line.append(f)
lines.append(line)
xyz = lines[i][2].split(' ')
x.append(xyz[0])
y.append(xyz[1])
z.append(xyz[2])
fl.close()
dic = {'x':x,'y':y,'z':z}
for k in dic:
p = dic[k]
p = np.asfarray(p)
print(type(p))
print(type(y[0]))
任何想法如何告诉python识别p = np.asfarray(p)
实际上是y = np.asfarray(y),并且当我在最后打印y
的类型时是float
的str
中?非常感谢您的帮助!
答案 0 :(得分:0)
一种了解发生情况的方法是将=
替换为is now a name for
。
您在循环中所做的是:
p
现在是dic[k]
的名称p
现在是np.asfarray(p)
的输出的名称等等。当您离开for
循环时,p
指向np.asfarray(dic('z'))
的输出。这就是这里发生的一切。
如果要更新字典中的值,则应该执行以下操作:
dic = {'x':x,'y':y,'z':z}
for k in dic:
dic[k] = np.asfarray(dic[k])
或者更好一点:
for key, value in dic.items():
dic[key] = np.asfarray(value)
现在,dic['y'] refers to the array returned by
np.asfarray`
但是您对y
并没有做任何事情,因此它仍然指向与以前相同的对象。如果要更改此设置,则必须编写类似y = ....
例如,您可以这样做:
y = dic['y']
有关更详尽的解释,请查看Facts and myths about Python names and values
答案 1 :(得分:0)
for k in dic:
p = dic[k]
p = np.asfarray(p)
print(type(p))
应该是
for k in dic:
p = dic[k]
dic[k] = np.asfarray(p)
print(type(p))
设置p = dic[k]
时,您正在调用dic[k]
并检索一个值,因为现在dic[
] == x
x p == x
。现在,当您尝试将该值分配给其对应的键时,您要调用dic[k] = np.asfarry(p)
,它将转换为dic['x'] = np.asfarry(x)
,现在它已分配给对应键的值。
这里是将其分解为视觉的视觉影像
dicta = {'a': 1 }
for k in dicta:
print(dicta[k])
p = dicta[k]
print(p)
dicta[k] = 3*p
print(dicta[a])
1 1 3
答案 2 :(得分:0)
for i in range(1000):
line = []
for j in range(4):
f= fl.readline()
line.append(f)
lines.append(line)
xyz = lines[i][2].split(' ')
x.append(xyz[0])
y.append(xyz[1])
z.append(xyz[2])
fl.close()
dic = {'x':x,'y':y,'z':z}
for k in dic:
p = dic[k]
p = np.asfarray(p)
print(type(p))
print(type(y[0]))
我提出的问题的答案是使用globals()
。有人会劝阻您使用它,但这是我能找到的唯一解决方案。让我解释:
在第一个for循环y.append(xyz[1])
中,将返回y
作为<str>
的列表,其中x
和z
的情况相同。
步骤2.我创建了这些变量x
,y
和z
及其值的字典。
步骤3.我想遍历dic
中的每个变量,并将x
列表中的y
,z
,str
的类型更改为numpy数组。
因此,当我打印y[0]
的类型时,它仍然是str
。
现在,如果第二个循环被替换为:
dic = {'x':x,'y':y,'z':z}
for k in sorted(dic):
globals()[k] = np.asfarray(dic[k])
print(type(y[0]))
我得到type(y[0])
:
<type 'numpy.float64'>