我是一个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非常熟悉。在
提前谢谢。在
你的问题是乘法:
d = d * np.ones((1,n))
。NumPy尝试执行元素级乘法,但由于维度不匹配(ones数组只有一行),这将失败。但是,当d是标量时,NumPy可以推断出您的意思是乘标量,因此代码将运行。在您真正想要做的是(据我所知)将每个元素展开为一个n长度的行。一种可能的解决方案是创建一个中间数组来保存新值,因为数组的大小是不可变的:
这有帮助吗?在
我们甚至不需要
^{pr2}$ones
:当针对
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。在相关问题 更多 >
编程相关推荐