Python/numpy数组分区

2024-09-29 19:12:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3.6和numpy。在

从hdf5文件中,我读取了一个2D数组的表列。在

数组的每一行保存有限元节点的ID。在

该表的结构使得它在同一个表中同时包含低阶和高阶元素(这很糟糕,但不是我可以更改的自由度)

所以数组看起来像这样(除了它可能有数百万行)

[[1,2,3,4,0,0,0,0],           #<- 4 Node quad data packed with zeros
 [3,4,5,6,0,0,0,0],             
 [7,8,9,10,11,12,13,14],      #<- 8 node quad in the same table as 4 node quad
 [15,16,17,18,19,20,21,22]]

我需要将这些信息分成两个独立的数组-一个用于4节点,一个用于8节点行。在

^{pr2}$

现在我在2D数组上迭代,检查每行中第5个值的值,并创建两个索引数组——一个标识4个节点行,另一个标识8节点行。在

for element in elements:
    if element[5] == 0:
        tet4indices.append(index)
    else:        
        tet10indices.append(index)
    index+=1  

然后我使用索引数组切片来获得这两个数组

tet4s=elements[tet4indices, 0:5]
tet10s=elements[tet10indices,0:10]

上面的方法可行,但看起来有点难看。在

如果有人有更好的解决方案,我会很高兴听到。。。。。在

提前谢谢你

道格


Tags: 文件innumpynodeindex节点数组elements
3条回答

这段代码足够通用,可以处理您的用例。i、 即使你的行被弄混了。下面给出了两种情况的示例。在

一个按顺序排列行的示例:

In [41]: arr
Out[41]: 
array([[ 1,  2,  3,  4,  0,  0,  0,  0],
       [ 3,  4,  5,  6,  0,  0,  0,  0],
       [ 7,  8,  9, 10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19, 20, 21, 22]])

# extract first half
In [85]: zero_rows = arr[~np.all(arr, axis=1), :]

In [86]: zero_rows
Out[86]: 
array([[1, 2, 3, 4, 0, 0, 0, 0],
       [3, 4, 5, 6, 0, 0, 0, 0]])

# to trim the trailing zeros in all the rows
In [84]: np.apply_along_axis(np.trim_zeros, 1, zero_rows)
Out[84]: 
array([[1, 2, 3, 4],
       [3, 4, 5, 6]])



# to extract second half
In [42]: mask_nzero = np.all(arr, axis=1)

In [43]: arr[mask_nzero, :]
Out[43]: 
array([[ 7,  8,  9, 10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19, 20, 21, 22]])

行混合的示例:

^{pr2}$

这对我有用:

a=np.split(your_numpy_array,[4],1)
tet4s=np.vstack([a[0][i,:] for i in range(len(a[0])) if np.sum(a[1][i,:])==0])
tet10s=np.vstack([np.hstack((a[0][i,:],a[1][i,:])) for i in range(len(a[0])) if np.sum(a[1][i,:])>0])

在数组中,很容易找到第5个元素为0或不是0的行:

In [75]: arr = np.array(alist)
In [76]: arr
Out[76]: 
array([[ 1,  2,  3,  4,  0,  0,  0,  0],
       [ 3,  4,  5,  6,  0,  0,  0,  0],
       [ 7,  8,  9, 10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19, 20, 21, 22]])
In [77]: arr[:,5]
Out[77]: array([ 0,  0, 12, 20])
In [78]: eights = np.where(arr[:,5])[0]
In [79]: eights
Out[79]: array([2, 3], dtype=int32)
In [80]: arr[eights,:]
Out[80]: 
array([[ 7,  8,  9, 10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19, 20, 21, 22]])
In [81]: fours = np.where(arr[:,5]==0)[0]
In [82]: arr[fours,:]
Out[82]: 
array([[1, 2, 3, 4, 0, 0, 0, 0],
       [3, 4, 5, 6, 0, 0, 0, 0]])

或者使用布尔掩码

^{pr2}$

从某种意义上说,你很幸运拥有这个清晰的0标记。一些有限元代码重复节点数以减少节点数,例如[1,2,3,3]对于4节点系统中的3节点单元。但在这些情况下,其余的数学工作正常,即使你将两个节点合并为一个。在

相关问题 更多 >

    热门问题