Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 展平数组的项分配_Python_Arrays_Numpy - Fatal编程技术网

Python 展平数组的项分配

Python 展平数组的项分配,python,arrays,numpy,Python,Arrays,Numpy,我正在翻译FEM-DG解算器,要应用边界条件,我必须应用以下代码: dEz.T.flatte()[mapB]=2*Ez.T.flatte()[vmapB] 其中dEz和Ez均为类型。但是,在使用断言检查赋值之后, assert np.all(dEz.T.flatte()[mapB]==2*Ez.T.flatte()[vmapB]) 这是最后通牒 我承认,展平和转置似乎很冗长,但我正在翻译Matlab中的代码,其中的赋值更简单一些,但也许我遗漏了一些东西 下面是一个小示例,它显示了我的问题: ``

我正在翻译FEM-DG解算器,要应用边界条件,我必须应用以下代码:

dEz.T.flatte()[mapB]=2*Ez.T.flatte()[vmapB]

其中
dEz
Ez
均为
类型。但是,在使用断言检查赋值之后,
assert np.all(dEz.T.flatte()[mapB]==2*Ez.T.flatte()[vmapB])

这是最后通牒

我承认,展平和转置似乎很冗长,但我正在翻译Matlab中的代码,其中的赋值更简单一些,但也许我遗漏了一些东西

下面是一个小示例,它显示了我的问题:

``

``


提前感谢您帮助我解决此问题。

为展平的numpy数组分配值可能很困难,因为函数
展平()
显式返回初始数组的副本,而
ravel()
有一个模棱两可的文档,说明仅在“需要”时复制数组(??)

我认为最好的方法是退一步,定义一个调用两行函数的简单循环,该函数返回后
平坦数组中任何元素
I
的2D数组
[m,n]
中的原始位置:

# A) Auxiliary function: index_flat
#      Returns the equivalent A[m,n] coordinates for any flattened-array index (i)'

def index_flat(A,i):
    c = A.shape[1]
    return i//c, i%c

# B) Initialization
import numpy as np;

E = np.linspace(1, 20, 20).reshape((4, 5));
V = E + 5;

# C) Classic Loop
inds_ET = [0,  1, 2]
inds_VT = [7, 10, 1]

for i,j in zip(inds_ET,inds_VT):
    i2       =  index_flat(E.T,i)
    j2       =  index_flat(V.T,j)
    E.T[i2]  =  V.T[j2]

# D) Assertion
assert np.all(E.T.flatten()[[0, 1, 2]] == V.T.flatten()[[7, 10, 1]])

另外,@MarcoP的答案非常好。我不知道作为迭代器的
flat
方法的存在。很高兴知道。

为展平的numpy数组赋值可能很难,因为函数
展平()
显式返回初始数组的副本,而
ravel()
有一个模棱两可的文档,说明数组仅在“需要”时复制(??)

我认为最好的方法是退一步,定义一个调用两行函数的简单循环,该函数返回后
平坦数组中任何元素
I
的2D数组
[m,n]
中的原始位置:

# A) Auxiliary function: index_flat
#      Returns the equivalent A[m,n] coordinates for any flattened-array index (i)'

def index_flat(A,i):
    c = A.shape[1]
    return i//c, i%c

# B) Initialization
import numpy as np;

E = np.linspace(1, 20, 20).reshape((4, 5));
V = E + 5;

# C) Classic Loop
inds_ET = [0,  1, 2]
inds_VT = [7, 10, 1]

for i,j in zip(inds_ET,inds_VT):
    i2       =  index_flat(E.T,i)
    j2       =  index_flat(V.T,j)
    E.T[i2]  =  V.T[j2]

# D) Assertion
assert np.all(E.T.flatten()[[0, 1, 2]] == V.T.flatten()[[7, 10, 1]])
另外,@MarcoP的答案非常好。我不知道作为迭代器的
flat
方法的存在。很高兴知道。

使用,它在数组上返回平坦迭代器:

例如:

v = np.ones((3,3))
v.flat[[3,4,5]] = [0,0,0]
print(v)

[[1. 1. 1.]
 [0. 0. 0.]
 [1. 1. 1.]]
下面是您的代码的更正版本:

import numpy as np;
E = np.linspace(1, 20, 20).reshape((4, 5));
V = E + 5;
E.T.flat[[0, 1, 2]] = V.T.flatten()[[7, 10, 1]];
assert np.all(E.T.flatten()[[0, 1, 2]] == V.T.flatten()[[7, 10, 1]])
使用,返回数组上的展平迭代器:

例如:

v = np.ones((3,3))
v.flat[[3,4,5]] = [0,0,0]
print(v)

[[1. 1. 1.]
 [0. 0. 0.]
 [1. 1. 1.]]
下面是您的代码的更正版本:

import numpy as np;
E = np.linspace(1, 20, 20).reshape((4, 5));
V = E + 5;
E.T.flat[[0, 1, 2]] = V.T.flatten()[[7, 10, 1]];
assert np.all(E.T.flatten()[[0, 1, 2]] == V.T.flatten()[[7, 10, 1]])

展平
制作副本
ravel
不这样做,除非它在
T
之后。需要考虑遮罩和RHS中元素的顺序,找出替代项。
展平
制作副本
ravel
不这样做,除非它在
T
之后。需要考虑遮罩和RHS中元素的顺序,以确定替代品。