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

2024-03-29 11:43:33 发布

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

我是一个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输出:

^{pr2}$

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非常熟悉。在

提前谢谢。在


Tags: 函数代码用户numpynpones整数数组
2条回答

你的问题是乘法:d = d * np.ones((1,n))。NumPy尝试执行元素级乘法,但由于维度不匹配(ones数组只有一行),这将失败。但是,当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.]])

我们甚至不需要ones

^{pr2}$

当针对power广播d时,power的维度扩展是自动的:d[:,None]%(2*power[None,:])。MATLAB中的ones实现了相同的维数扩展(到(2,8)形状的数组)。在

可能需要从d=np.atleast_1d(d)开始,因此它将标量大小写视为1元素数组。我们可以对其进行优化,使其在给定标量时返回1d数组,在给定list或1d数组时返回2d数组。在MATLAB中,一切都是2d或更高。在


更好的是,在展开d时使用ellipsis。那么d可以是0d,1d,甚至nd。在

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

相关问题 更多 >