Python 对整数和数组输入使用numpy数组

Python 对整数和数组输入使用numpy数组,python,arrays,matlab,numpy,Python,Arrays,Matlab,Numpy,我是一名Matlab用户,正在尝试进入Python。我试着用Python编写一个最简单的示例de2bi函数(它将十进制数转换为二进制数作为右msb),这是我以前在Matlab中使用过的。但是,我对numpy数组感到困惑 Python代码: import numpy as np def de2bi(d, n) d = np.array(d) power = 2**np.arange(n) d = d * np.ones((1,n)) b = np.floor((d

我是一名Matlab用户,正在尝试进入Python。我试着用Python编写一个最简单的示例
de2bi
函数(它将十进制数转换为二进制数作为右msb),这是我以前在Matlab中使用过的。但是,我对numpy数组感到困惑

Python代码:

import numpy as np

def de2bi(d, n)
    d = np.array(d)
    power = 2**np.arange(n)
    d = d * np.ones((1,n))
    b = np.floor((d%(2*power))/power)
    return b
Python输出:

>>> print(de2bi(13,8))
[[ 1.  0.  1.  1.  0.  0.  0.  0.]]

print(de2bi([13,15],8)) #This line fails
Matlab代码:

function b = d2b( d, n )
    d = d(:);
    power = ones(length(d), 1)*(2.^(0 : n-1));
    d = d * ones(1, n);
    b = floor(rem(d, 2*power)./power);
end
Matlab输出:

>> d2b(13,8)

ans =

     1     0     1     1     0     0     0     0

>> d2b([13,15],8)

ans =

     1     0     1     1     0     0     0     0
     1     1     1     1     0     0     0     0
Matlab代码适用于整数输入和整数数组。但是python代码适用于整数输入,但对于数组却一直失败。如何在Python中自动管理整数和整数数组的操作?对不起,这可能是一个非常简单的问题,但我是python的新手


提前谢谢。

您的问题在于乘法:
d=d*np.ones((1,n))
。NumPy尝试执行按元素的乘法,但由于维度不匹配(您的数组只有一行),乘法将失败。但是,当d是标量时,NumPy可以推断您的意思是乘法到标量,因此代码将运行

您真正想要做的(据我所知)是将每个元素扩展到一个n长度的行。一种可能的解决方案是创建一个中间数组来保存新值,因为数组的大小是不可变的:

def d2b(d, n):
    d = np.array(d)
    d = np.reshape(d, (1, -1))
    power = np.flipud(2**np.arange(n))

    g = np.zeros((np.shape(d)[1], n))

    for i, num in enumerate(d[0]):
        g[i] = num * np.ones((1,n))
    b = np.floor((g%(2*power))/power)
    return b
这有用吗

In [439]: d=np.array([13,15])
In [440]: power=np.ones((d.shape[0],1))*(2**np.arange(8))
In [441]: power
Out[441]: 
array([[   1.,    2.,    4.,    8.,   16.,   32.,   64.,  128.],
       [   1.,    2.,    4.,    8.,   16.,   32.,   64.,  128.]])
In [442]: np.floor((d[:,None]%(2*power))/power)
Out[442]: 
array([[ 1.,  0.,  1.,  1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.]])
我们甚至不需要

In [443]: power = 2**np.arange(8)
In [444]: np.floor((d[:,None]%(2*power))/power)
Out[444]: 
array([[ 1.,  0.,  1.,  1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.,  0.,  0.,  0.]])
当针对
power
广播
d
时,
power
的维度扩展是自动的:
d[:,None](2*power[None,:])
。MATLAB中的
阵列
实现了相同的维数扩展(到(2,8)形阵列)

可能需要从
d=np开始。至少\u 1d(d)
,因此它将标量情况视为一个1元素数组。我们可以对其进行优化,使其在给定标量时返回一维数组,在给定列表或一维数组时返回二维数组。在MATLAB中,所有内容都是2d或更高


更好的方法是,在展开
d
时使用
省略号。那么d可以是0d、1d甚至nd

np.floor((d[...,None]%(2*power))/power)

使用
flipud
看起来很有趣。您应该能够像matlab one一样编写numpy电源线,利用广播来生成2d数组。@hpaulj问题是,当我尝试使用整数输入时,python不会将其转换为类似[x]的列表,当我手动转换时,数组会变为类似[x,y]]的[x,y]列表。我想我需要得到x的[x]和[x],[y]]的[x,y],但我不知道如何像在matlab中那样用几行代码来管理这个简单的步骤。我们真的需要一个循环吗?有没有一种直接的方法可以让numpy在没有任何循环的情况下处理这个问题?我不是100%肯定,因为我们仍然依赖于标量数组乘法。也许你可以把这个运算转换成数组乘法(np.dot())?也许是用一个单位矩阵而不是一个,但我不确定这个单位矩阵的数学原理。谢谢你的回答。我想有一种直接的方法可以在不进入循环的情况下得到与matlab相同的运算。我刚刚开始学习python,并尝试处理基础知识。我希望我们也能看到其他捷径的答案。(我很抱歉,我不能给你+1,因为我还没有足够的声誉)谢谢你的回答。它适用于
d=[13,15]
,但当d直接作为
d=13
分配给整数时,即使在使用
d=np之后,它也会给出索引器。至少\u 1d(d)
。在MATLAB中,它会自动将整数x转换为数组[x],因此在操作过程中不会出现任何问题。我在没有看到您对
np.floor((d[…,None](2*power))的编辑的情况下发表了评论/power
。它现在也适用于0d数组。但输出格式不同。这适用于正向操作,但不适用于反向函数。我可以通过编辑将我的解决方案以及添加到您的答案中,然后接受您的答案吗?
至少应使用标量。请记住,MATLAB可以没有标量;所有东西都是2d的。您的1行MATLAB案例具有形状(1,8),在numpy中可能是(8,)。