Numpy:安排输入和输出向量的正确方法

时间:2017-09-08 20:50:13

标签: python arrays numpy

我正在尝试创建一个包含2列和多行的numpy数组。第一列用于表示大小为3的输入向量。第二列用于表示大小为2的输出向量。

arr = np.array([
    [np.array([1,2,3]), np.array([1,0])]
    [np.array([4,5,6]), np.array([0,1])]
])

我原以为:arr[:, 0].shape 返回(2,3),但返回(2,)

使用numpy将输入和输出向量排列到矩阵中的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您确定每列中的元素具有相同的大小/长度,您可以选择然后使用numpy.row_stack堆叠结果:

np.row_stack(arr[:,0]).shape
# (2, 3)

np.row_stack(arr[:,1]).shape
# (2, 2)

答案 1 :(得分:0)

所以,代码

legend

创建一个对象数组,索引第一列会返回两行,每行包含一个对象,这些行占用了大小。为了获得你想要的东西,你需要把它包装成像

这样的东西
import math, matplotlib.pyplot as plt, random 

def probability(x):

    #wavefunction n=0 evaluated at position x
    psi_0_x=math.exp(-x ** 2 / 2.0) / math.pi ** 0.25

    #probability n=0 to be at position x
    psi_0_x_squared= psi_0_x**2

    return psi_0_x_squared

data_x=[0]
x = 0.0        #starts at position 0
delta = 0.5    #stepsize
trial_steps=1000000

for t in range(trial_steps):

    #displace x by delta
    x_new = x + random.uniform(-delta, delta) 

    #selecciono un numero entre 0 y 1 (incluye acceptance y rejection probability). Metropolis!
    #probabilidad de estar en nuevo sitio/probabilidad de quedarme en el sitio anterior 
    if random.uniform(0.0, 1.0) < probability(x_new)/probability(x):

        #me muevo si la condicion es cierta (está en el accepted range)
        x = x_new 
    data_x.append(x)

#histogram
cm = plt.cm.get_cmap('hot') 
n, bins, patches= plt.hist(data_x, bins=100, normed=True, color='r',label='Histogram')


plt.xlabel('x')
plt.ylabel('$Probability =|\psi_0(x)|^2$')

#general analytical formula
x_grid = [a / 100.0 for a in range(-300,301)]
Prob = [probability(position) for position in x_grid]
plt.plot(x_grid, Prob, linewidth=1.5, color='k', label='Analytical')
plt.title("Position's probability density $|\psi_0(x)|^2$ for a harmonic oscillator.")
# first legend, then updating the facecolor
plt.legend()
for height, p in zip(n, patches):
    plt.setp(p, 'facecolor', cm(height))
# finally save the figure
plt.savefig('ground_probability_x.png')
plt.show()

从第一列中的对象中创建一个数组。这不是很方便,将它们存储在字典中会更有意义,比如

arr = np.array([
[np.array([1,2,3]), np.array([1,0])],
[np.array([4,5,6]), np.array([0,1])]
])

结构化数组可以为您提供两者。对于给出的例子,创建有点棘手,

np.vstack(arr[:, 0])

创建一个包含字段io = {'in': np.array([[1,2,3],[4,5,6]]), 'out':np.array([[1,0], [0,1]]) } arr = np.array([ (1,2,3), (1,0)), ((4,5,6), (0,1)) ], dtype=[('in', '3int64'), ('out', '2float64')]) 的结构化数组,分别由3个整数和2个浮点组成。可以像往常一样访问行

in

或通过字段名称

out

numpy手册有更多细节(https://docs.scipy.org/doc/numpy-1.13.0/user/basics.rec.html)。我无法添加任何细节,因为我打算在项目中使用它们一段时间,但是没有。