- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的代码
import math
import itertools
with open('/home/milenko/OCCAM2DMT_V3.0/13042/ITER04.iter') as f:
lines_after_19 = f.readlines()[19:]
p = []
for line in lines_after_19:
line = line.split()
line = [float(i) for i in line]
p.extend(line)
a1=p[1:81]
for i in a1:
b1=math.pow(10, i)
a2=p[83:163]
for i in a2:
b2=math.pow(10,i)
a3=p[165:245]
for i in a3:
b3=math.pow(10,i)
a4=p[247:327]
for i in a4:
b4=math.pow(10,i)
a5=p[329:409]
for i in a5:
b5=math.pow(10,i)
a6=p[411:491]
for i in a6:
b6=math.pow(10,i)
c = itertools.chain(b1, b2, b3, b4, b5, b6)
print type(c)
我需要将 c 转换为 numpy
数组,用于 reshape
然后进一步计算。
最佳答案
这被标记为重复并引用了这个:How do I build a numpy array from a generator?问题。
排名最高的答案,使用 fromiter
在处理生成器时是一个不错的选择,但这并没有真正解决这个问题中的问题。
如评论所述,for
除了最后一次计算外,循环不保存任何东西。他们不必要地执行math.pow
也可以在 numpy
中完成的计算.
跳过 pow
现在位:
In [36]: ll=range(100)
In [53]: a=ll[0:20]
In [54]: b=ll[22:40]
In [55]: c=ll[42:60]
我可以通过多种方式将它们组合成一个数组;首先只是一个列表。
In [56]: len(list(itertools.chain(a,b,c)))
Out[56]: 56
来自该列表的数组
In [57]: np.array(list(itertools.chain(a,b,c)))
Out[57]:
array([ 0, 1, 2, 3, 4, 5,...., 59])
fromiter
有点快;
In [58]: np.fromiter(itertools.chain(a,b,c),int)
Out[58]:
array([ 0, 1, 2, 3, 4, 5, ... 58, 59])
concatenate
也是如此- 它将其输入转换为数组并将它们连接起来(默认为平面):
In [59]: np.concatenate((a,b,c))
Out[59]:
array([ 0, 1, 2, 3, 4, 5, ... 52, 53, 54,
55, 56, 57, 58, 59])
很容易执行 pow
数组上的计算
In [62]: 10**(la/100.)
Out[62]:
array([ 1. , 1.02329299, 1.04712855, 1.07151931, 1.0964782 ,
1.12201845, 1.14815362, 1.17489755, 1.20226443, 1.23026877,
...
3.4673685 , 3.54813389, 3.63078055, 3.71535229, 3.80189396,
3.89045145])
因为数字已经从文件中读入,并且出现在列表 p
中, 尝试使用生成器来节省内存没有多大意义。 chain
在这里很有用,只是作为创建平面列表的一种方式。
如果文件中的所有行都有相同数量的项目,它可能已经加载了 np.loadtxt
.结果将是一个二维数组。
所有子列表的长度都是 80。每行中是否有 81 个数字,而您跳过了第一个?如果是这样,loadtxt
数组将是 (N,81)
形状,你可以很容易地用切片去掉第一个[:, 1:]
.
由于您链接的所有列表的长度都相同,您可以将它们传递给 np.array
无链。
np.array((b1, b2, b3, b4, b5, b6))
会产生 (6,80)
形阵列。不需要 reshape
- 除非你想要一个不同的。
关于python - 如何将 itertools.chain 转换为 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632404/
我是一名优秀的程序员,十分优秀!