将数组与交替列选择相乘

时间:2017-05-13 22:05:08

标签: python arrays list numpy multiplication

我有一个文件testforce.dat,显示的值分为9列和3行。前3列代表:

p1   p2  p3 f1  f2   f3 r1  r2  r3    
18   5  27  20  21   8  14  12  25
 9  26  23   1   4  10   7  16  24
19  22  15  13  17   6  11   2   3

我有100个这种时尚的文件 我现在想要计算文件force_00000.dat向量g = [sum(p1*f1), sum(p2*f2), sum(p3*f3)]但是对于下一个文件force_00001.dat,向量应该使用其他列h = [sum(p1*r1), sum(p2*r2), sum(p3*r3)]

目前我正在使用glob函数将我的文件读入数组。它将每一行放入一个数组中。  我不知道如何完成我的交替数组乘法,并希望得到任何建议:)

import numpy as np
import glob

i = 100
for x in range(0,int(i)):


## turns x into a string and adds if necessary "0" to achieve a fixed digit number; 
y = str(x).zfill(5) 

## the structure of the forcefile is "force_[00000-00099]";
files = sorted(glob.glob('.//results/force/force_%s.dat' % y))  
column_names=('#position')


print files

## loads the file data into arrays 
arrays=[np.loadtxt(filename) for filename in files]
print arrays

编辑:我测试了第一个文件的加载:

b=np.array(arrays)
print b.shape

我得到(1,3,9)我生成的数组的形状。

Edit2:我有想法使用" usecols"然后乘以所需的值:

xposition=[np.loadtxt(filename,usecols= (0,1,2)) for filename in files]
xforce1=[np.loadtxt(filename,usecols= (3,4,5)) for filename in files]
print xposition
print xforce1
xp=np.asarray(xposition)
xf1=np.asarray(xforce1)

print xp
g=np.multiply(xp,xf1)
print g

这会产生以下输出:

[[[ 360.  105.  216.]
[   9.  104.  230.]
[ 247.  374.   90.]]]

这意味着我有(p11和f11是第一行的值,p21来自第二行......)

[[[p11*f11  p12*f12  p13*f13] 
 [p21*f21  p22*f22  p23*f23]
 [p31*f31  p32*f32   p33*f33]]]

对于至少一个文件来说,我似乎只做了一件事。所需的g(g1,g2,g3)应如下所示:

p11*f11+p21*f21+p31*f31= g1
p12*f12+p22*f22+p32*f32= g2
p13*f13+p23*f23+p33*f33= g3

很抱歉,如果这是一个全新的问题,但我还不熟悉python:)

对于交替值的问题,我正在考虑使用if函数检查是否" i"在循环中是偶数

1 个答案:

答案 0 :(得分:0)

loadtxt返回一个数组。 [loadtxt(name) for name in filenames]生成一个数组列表,每个名称一个数组。 np.array([...])从该列表生成一个数组。如果各个数组的大小都相同,则生成的数组将为3d。

如果您需要以不同方式处理所有其他文件,则可以将其作为带索引的集合

进行访问
arr[::2,...] 
arr[1;:2,...]

要将示例文件中的两组列相乘:

In [558]: txt=b"""p1   p2  p3 f1  f2   f3 r1  r2  r3    
     ...: 18   5  27  20  21   8  14  12  25
     ...:  9  26  23   1   4  10   7  16  24
     ...: 19  22  15  13  17   6  11   2   3"""

In [560]: arr = np.loadtxt(txt.splitlines(),skiprows=1,dtype=int)
In [561]: arr
Out[561]: 
array([[18,  5, 27, 20, 21,  8, 14, 12, 25],
       [ 9, 26, 23,  1,  4, 10,  7, 16, 24],
       [19, 22, 15, 13, 17,  6, 11,  2,  3]])

In [562]: arr[:, 0:3]*arr[:, 3:6]
Out[562]: 
array([[360, 105, 216],
       [  9, 104, 230],
       [247, 374,  90]])

In [563]: arr[:, 0:3]*arr[:, 6:9]
Out[563]: 
array([[252,  60, 675],
       [ 63, 416, 552],
       [209,  44,  45]])

如果arr是加载多个文件的3d数组,

arr1 = arr[::2,...]
arr2 = arr[1::2,...]
arr1[:,:,0:3] * arr1[:,:,3:6]
etc