科学的python数组语法

2024-04-19 06:42:59 发布

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

所以我用python编写了这个代码。我不打算解释它,因为它是一个简单的语法修复,我似乎看不到,所以它是无用的解释是什么。你知道吗

我的问题是,对于给定的d,例如15,我得到了正确的“cuentas”值和正确的“e”。你知道吗

我要做的是遍历一组d,得到每个cuenta和每个e的值,以便绘制d和e

我的问题是,我似乎不知道如何在python中创建矩阵。你知道吗

在matlab中,我曾经编写过两个不同的循环,如theese:

for i=1:1:N
    for j=1:9

      a[i,j]= and so on

a[i,j]是一个有N行9列的矩阵,我可以访问和操作它。你知道吗

在下面的代码中,我会有意地将#注释放在我想要遍历距离的地方

import numpy as np
import matplotlib.pyplot as plt
N=100000
cos=np.zeros(N)
phi=np.zeros(N)
teta=np.zeros(N)
a=np.zeros(N)


xrn=np.zeros(N)
yrn=np.zeros(N)
zrn=np.zeros(N)

x=np.zeros(N)
y=np.zeros(N)
z=np.zeros(N)

lim1=14.7
lim2=3.35
lim3=-lim1
lim4=-lim2

#d=np.array([15,20,25,30,35,40,45,50,55])
d=15

    #for j in range(9):
for i in range(N):
    cos[i]=np.random.uniform(-1,1)
    teta[i]=np.random.uniform(-np.pi,np.pi)
    phi[i]=np.random.uniform(0,2*np.pi)

# a[i]=d[j]/cos[i]*np.cos(phi[i])
a[i]=d/cos[i]*np.cos(phi[i])


xrn[i]=np.random.uniform(-1,1)*lim1
yrn[i]=np.random.uniform(-1,1)*lim2

x[i]=a[i]*np.sin(teta[i])*np.cos(phi[i])+xrn[i]
y[i]=a[i]*np.sin(teta[i])*np.sin(phi[i])+yrn[i]

#cuentas[j]=0
cuentas=0

#for j in range(9):
for i in range(N):
    if a[i]>0 and x[i] < lim1 and x[i]>lim3 and y[i] < lim2 and y[i]>lim4:
        cuentas=cuentas+1
#e[j]=cuenta[j]/N
e=cuentas/N

非常感谢那些阅读的人!!你知道吗


Tags: andinfornpzerosrangerandomuniform
3条回答

所以我采纳了你的答案,而且成功了!你知道吗

如果有人想知道这是一个蒙特卡罗模拟多少粒子将通过两个角度探测器。当我把粒子从探测器1扔出去的时候,它们通过它是微不足道的,我计算通过探测器2的数量。你知道吗

修正后的代码为

N=100000
"La dirección viene dada por v=[rsin(teta)*cos(phi),rsin(teta)sin(phi),rcos(teta)]"
"Los vectores que vamos a usar debemos inicializarlos como un vector de ceros"
cos=np.zeros([10,N])
phi=np.zeros([10,N])
teta=np.zeros([10,N])
a=np.zeros([10,N])

xrn=np.zeros(N)
yrn=np.zeros(N)
zrn=np.zeros(N)

x=np.zeros([10,N])
y=np.zeros([10,N])
z=np.zeros([10,N])

lim1=14.7
lim2=3.35
lim3=-lim1
lim4=-lim2
"d son las disversas distancias a las que colocamos la fuente con respecto al detector"

d=np.array([0.00001,15,20,25,30,35,40,45,50,55])

"e es la eficiencia geométrica simulada"
e=np.zeros(10)

"Debemos definir el coseno como números aleatorios en vez de el ángulo teta, debido a que queremos"
"que se distribuyan uniformemente por toda la esfera"
for j in range(10):
    for i in range(N):
        cos[j,i]=np.random.uniform(0,1)

        phi[j,i]=np.random.uniform(0,2*np.pi)

        a[j,i]=d[j]/cos[j,i]

        xrn[i]=np.random.uniform(-1,1)*lim1
        yrn[i]=np.random.uniform(-1,1)*lim2

        x[j,i]=a[j,i]*np.sin(math.acos(cos[j,i]))*np.cos(phi[j,i])+xrn[i]
        y[j,i]=a[j,i]*np.sin(math.acos(cos[j,i]))*np.sin(phi[j,i])+yrn[i]


cuentas=np.zeros(10)
for j in range(10):
    for i in range(N):
        if a[j,i]>0 and x[j,i] < lim1 and x[j,i]>lim3 and y[j,i] < lim2 and y[j,i]>lim4:
            cuentas[j]=cuentas[j]+1

    e[j]=cuentas[j]/N

谢谢大家!你知道吗

短版本:

这与Python中的MATLAB代码完全相同

a = np.zeros([N, 9])
for i in range(N):
    for j in range(9):
        a[i,j]= and so on

唯一的主要区别是需要预先定义数组,如果希望代码具有合理的性能,那么也应该在MATLAB中这样做。你知道吗

但是,如果事先不知道大小,可以在Python中使用列表,然后在最后转换为numpy数组。这将比大型数组的MATLAB示例快得多,因为列表和矩阵/数组是如何处理的:

a = []
for i in range(N):
    a.append([])
    for j in range(9):
        a[-1].append( and so on
a = np.array(a)

[-1]表示“a的最后一个元素”,而append则将括号内的内容放在列表末尾。所以。a[-1].append(foo)意思是“把foo放在a最后一个元素的任何东西里面。你知道吗

长版本:

您的MATLAB代码在Python中的工作方式大致相同,但是您需要考虑一些显著的差异。你知道吗

首先,分配给大于现有数组/矩阵的索引在MATLAB中工作,但在numpy中不工作。因此,如果你有一个大小[5, 5]的数组/矩阵,在MATLAB中你可以指定给元素[5, 6],但是在numpy中你不能。这意味着在MATLAB中,可以从空数组开始,而在numpy中,必须事先设置数组大小。请注意,MATLAB矩阵实际上无法调整大小,实际上每次通过循环时都会生成一个新矩阵,并将所有数据复制到其中。这是非常缓慢的,这就是为什么MATLAB警告您预先分配数组。Numpy只是不能假装能够调整数组的大小,所以您需要更明确地执行复制、预分配或使用列表(可以调整大小)。你知道吗

第二,类似地,MATLAB不需要在使用之前定义矩阵,而numpy需要。这是因为传统上MATLAB有三种数据结构(矩阵、单元数组和结构),每种结构都有自己的索引风格。因此,MATLAB可以根据索引的方式来确定要创建什么样的数据结构。Python只有一种索引方式,所以它不能进行这种猜测。你知道吗

第三,在MATLAB中使用一个数组大小和一些(但不是全部)函数创建一个具有该大小的每个维度的2D平方矩阵,而在numpy中创建一个1D数组。我不确定从你的代码,如果这是你所期待的或不是。坦白地说,我不知道为什么MATLAB是这样工作的。你知道吗

第四,numpy数组可以有任意数量的维数,0(标量)、1(向量)、2、3、4等等。另一方面,MATLAB矩阵必须至少有两个维数。这可能会导致一些意外的差异,比如转置对numpy向量不起任何作用。你知道吗

至于你的Python代码,如果你不说哪里出了问题,我就不能告诉你如何修复它。但希望我已经给了你足够的信息让你自己去做。你知道吗

可以按以下方式使用numpy在python中创建矩阵:

n=5
k=4
a=np.zeros([n,k])
for i in range(n):
    for j in range(k):
        a[i,j]=i+j
print(a)

结果是

[[ 0.  1.  2.  3.]
 [ 1.  2.  3.  4.]
 [ 2.  3.  4.  5.]
 [ 3.  4.  5.  6.]
 [ 4.  5.  6.  7.]]

相关问题 更多 >