Python 对整数和数组输入使用numpy数组
我是一名Matlab用户,正在尝试进入Python。我试着用Python编写一个最简单的示例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
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,)。