在矩阵Python上添加新条件

2024-06-26 11:28:01 发布

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

在计算三维网格上点的坐标,并将获得的值存储在以下数组中之后:

import numpy as np

x = np.zeros(4*4*8, float)
y = np.zeros(4*4*8, float)
z = np.zeros(4*4*8, float)

for l in range(4*4*8):
    x[l], y[l], z[l] = np.unravel_index(l, (8, 4, 4))

我把我的矩阵定义为

def getMatrix(kappa, x, y, z):


   nxnynz = 4*4*8
   nrange_x = np.arange(nxnynz)
   nrange_y = nrange_x
   w, r = np.meshgrid(nrange_x, nrange_y)
   delta_r = np.sqrt(((x[w]-x[r])**2)+((y[w]-y[r])**2)+((z[w]-z[r])**2)*)

   matrix = np.zeros(delta_r.shape)

   matrix[delta_r == 0] = 4.*kappa/(nxnynz**3.)
   matrix[delta_r != 0] = np.sin(kappa*2.*np.pi*delta_r[delta_r != 0])/(delta_r[delta_r != 0]*float(nxnynz))

其中关键点是当delta_r == 0delta_r != 0时这些值的不同定义。 现在,除了这个规范,我还需要添加另一个规范,即条件(在写得不好的代码中,只是为了给出一个想法)

if ((abs(w-r)) % 8 ) != 0:
    matrix[w][r] = 0.

其中wr是以前使用的相同索引。如何在矩阵的先前定义中适应这个新条件


Tags: import规范网格定义npzeros矩阵数组
1条回答
网友
1楼 · 发布于 2024-06-26 11:28:01

这应该是布尔索引的直接用法。例如:

In [401]: w,r=np.meshgrid(np.arange(3),np.arange(2))
In [402]: w
Out[402]: 
array([[0, 1, 2],
       [0, 1, 2]])
In [403]: r
Out[403]: 
array([[0, 0, 0],
       [1, 1, 1]])
In [404]: mat = np.ones(w.shape,int)
In [405]: mat
Out[405]: 
array([[1, 1, 1],
       [1, 1, 1]])

In [406]: abs(w-r)%8
Out[406]: 
array([[0, 1, 2],
       [1, 0, 1]], dtype=int32)
In [407]: (abs(w-r)%8)!=0
Out[407]: 
array([[False,  True,  True],
       [ True, False,  True]], dtype=bool)

In [408]: mat[(abs(w-r)%8)!=0]=0
In [409]: mat
Out[409]: 
array([[1, 0, 0],
       [0, 1, 0]])

如果没有充分研究您的代码,我认为您的matrix(坏名字)与wr具有相同的形状。我可以在满足条件的地方构造一个布尔数组,并很容易地应用matrix

相关问题 更多 >