小编cha*_*com的帖子

在numpy中ndarray的"ndim,shape,size,.. etc"的标识是什么?

我是Python的新手.

在使用Matlab多年之后,最近,我开始研究numpy/scipy

似乎numpy最基本的元素似乎是ndarray.在ndarray中,有以下属性:

  • ndarray.ndim
  • ndarray.shape
  • ndarray.size
  • ...等等

我对C++/JAVA类非常熟悉,但我是Python OOP的新手.


Q1:我的第一个问题是上述属性的身份是什么?

首先,我假设上面的属性可能是公共成员变量.但很快,我发现这a.ndim = 10不起作用(假设a是一个对象ndarray)所以,它似乎不是一个公共成员变量.

接下来,我猜测它们可能是类似于C++中的getter方法的公共方法.但是,当我尝试a.nidm()使用括号时,它不起作用.所以,它似乎不是一种公共方法.

另一种可能是它们是私有成员变量,但是打印a.ndim工作,因此它们不能是私有数据成员.

所以,我无法弄清楚上述属性的真实身份是什么.


Q2.我在哪里可以找到Python代码的实现ndarray?由于我在我的本地PC上安装了numpy/scipy,我想可能有一些方法来查看源代码,然后我认为一切都可能很清楚.

你能就此提出一些建议吗?

python numpy multidimensional-array

4
推荐指数
2
解决办法
3313
查看次数

在 tensorflow 2.0 beta 中从 tf.data.Dataset 中检索下一个元素

在 tensorflow 2.0-beta 之前,为了从 tf.data.Dataset 中检索第一个元素,我们可以使用如下所示的迭代器:

#!/usr/bin/python

import tensorflow as tf

train_dataset = tf.data.Dataset.from_tensor_slices([1.0, 2.0, 3.0, 4.0])
iterator = train_dataset.make_one_shot_iterator()
with tf.Session() as sess:
    # 1.0 will be printed.
    print (sess.run(iterator.get_next()))
Run Code Online (Sandbox Code Playgroud)

在 tensorflow 2.0-beta 中,上面的一次性迭代器似乎已被弃用。要打印出整个元素,我们可以使用下面方法。

#!/usr/bin/python

import tensorflow as tf

train_dataset = tf.data.Dataset.from_tensor_slices([1.0, 2.0, 3.0, 4.0])

for data in train_dataset:
    # 1.0, 2.0, 3.0, and 4.0 will be printed.
    print (data.numpy())
Run Code Online (Sandbox Code Playgroud)

但是,如果我们只想从 tf.data.Dataset 中准确检索一个元素,那么我们如何使用 tensorflow 2.0 beta 呢?好像next(train_dataset)不支持。如上所示,使用旧的一次性迭代器可以轻松完成,但使用基于for的新方法不是很明显。

欢迎任何建议。

python iterator tensorflow tensorflow-datasets tensorflow2.0

4
推荐指数
2
解决办法
4129
查看次数

我们需要在python中使用open来关闭文件吗?

根据我在网上看到的内容,以下似乎是从python中的整数数据组成的二进制文件中读取数据的示例:

in_file = open('12345.bin', 'rb');
x = np.fromfile(in_file, dtype = 'int32');
Run Code Online (Sandbox Code Playgroud)

在Matlab中,我认为相应的命令是:

in_file = fopen('12345.bin', 'rb');
x = fread(in_file, 'int32');
fclose(in_file);
Run Code Online (Sandbox Code Playgroud)

在Matlab中,文件应该fclose在完成使用后关闭.在NumPy中有没有相应的东西?

python matlab numpy file

3
推荐指数
1
解决办法
1034
查看次数

选择numpy数组的列

我对选择NumPy数组的列感到有些困惑,因为结果与Matlab甚至NumPy矩阵不同.请参阅以下案例.

Matlab中,我们使用以下命令从矩阵中选择列向量.

x = [0, 1; 2 3]
out = x(:, 1)
Run Code Online (Sandbox Code Playgroud)

然后out成为[0; 2]列向量.

使用NumPy Matrix做同样的事情

x = np.matrix([[0, 1], [2, 3]])
out = x[:, 0]
Run Code Online (Sandbox Code Playgroud)

然后输出是np.matrix([[0], [2]])预期的,它是一个列向量.

但是,在NumPy数组的情况下

x = np.array([[0, 1], [2, 3]])
out = x[:, 0]
Run Code Online (Sandbox Code Playgroud)

输出是np.array([0, 2])1维的,因此它不是列向量.我的期望是应该的np.array([[0], [2]]).我有两个问题.

1. 为什么NumPy数组的输出与NumPy矩阵情况不同?这给我带来了很多困惑,但我认为这可能有一些原因.

2. 要从2-Dim NumPy数组中获取列向量,我应该执行其他操作,例如expand_dims

x = np.array([[0, 1], [2, 3]])
    out = np.expand_dims(x[:, 0], axis = 1)
Run Code Online (Sandbox Code Playgroud)

python arrays numpy vector matrix

3
推荐指数
1
解决办法
1万
查看次数

为什么python"dtype = float"是8字节而不是4字节?

这些天,我已经从Matlab转到了NumPy/SciPy.

今天,当我尝试加载以"二进制格式"存储的数据时,我遇到了一个奇怪的问题.音频数据以4字节单精度浮点数 格式存储.我先尝试了以下内容.

data = np.fromfile('out.raw', dtype=float) # This is wrong
plt.plot(data)
Run Code Online (Sandbox Code Playgroud)

但它没有用.经过一些搜索,我尝试了以下内容,它按预期工作:

data = np.fromfile('out.raw', dtype=np.float32) # This is okay.
plt.plot(data)
Run Code Online (Sandbox Code Playgroud)

根据我以前使用C/C++的经验,我曾预计"float"是一个4字节的单精度浮点类型.但事实证明浮点数是8字节数据,在上面的例子中,我应该使用np.float32.

我有两个问题.

Q1.为什么浮点数是8字节而不是4字节,这可能让C/C++程序员感到困惑?

Q2.为什么我不能使用dtype = float32.这会给我带来错误.我好像应该使用dtype = np.float32?

谢谢!

python floating-point binary numpy

3
推荐指数
1
解决办法
1822
查看次数

使用 bash 脚本中 .bashrc 中定义的环境变量

如果我们在 .bashrc 中设置自定义环境变量,如下所示:

TMP_STRING='tmp string'
Run Code Online (Sandbox Code Playgroud)

看来这个变量不能直接从 bash 脚本访问。

#!/bin/bash

echo $TMP_STRING
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法,但它也不起作用:

#!/bin/bash

source ~/.bashrc

echo $TMP_STRING
Run Code Online (Sandbox Code Playgroud)

您能建议在这种情况下正确的方法是什么吗?谢谢你!

bash environment-variables

3
推荐指数
1
解决办法
7450
查看次数

相当于matlab"ans"和运行shell命令

这些天,我使用Matlab/Octave超过十年后,从Matlab过渡到Python.我有两个简单的问题:

  1. 在Python交互模式中,有没有与Matlab相对应的东西ans
  2. 如何在Python交互模式下运行shell命令?当然,我可以使用os.system(),但在Matlab中我们可以只!在实际命令之前放置shell命令.Python中有类似的东西吗?

python shell matlab

2
推荐指数
1
解决办法
301
查看次数

如何在NumPy/SciPy中删除一些变量?

我正在从Matlab/Octave过渡到NumPy/SciPy.当我在交互模式下使用Matlab时,我不时使用clearclear [some_variable]从内存中删除该变量.例如,在阅读一些新数据以开始一组新的实验之前,我曾经在Matlab中清除数据.

我怎么能用NumPy/SciPy做同样的事情?

我做了一些研究,我发现有一个命令del,但我听说del实际上并没有清除内存,但变量从命名空间中消失了.我对吗?

话虽这么说,在NumPy/SciPy中模仿"清除"Matlab的最佳方式是什么?

python matlab numpy clear

2
推荐指数
1
解决办法
2432
查看次数

在NumPy中,np.array([1,2,3,4,5])与np.array不同([[1],[2],[3],[4],[5]])?

我最近从Matlab/Octave切换到SciPy/NumPy,我喜欢它.但我发现有时候由于微妙的差异我会感到困惑.

在Matlab中,当我们声明一个大小为5的"行向量"时,我们使用以下命令:

x = [1, 2, 3 ,4, 5]  % in matlab
Run Code Online (Sandbox Code Playgroud)

可以使用" size"命令检查此向量的大小,如下所示:

size(x)

ans =

     1     5
Run Code Online (Sandbox Code Playgroud)

我曾假设NumPy中的以下内容与上面的内容完全相同.

 x = np.array([1, 2, 3, 4, 5])  # in NumPy
Run Code Online (Sandbox Code Playgroud)

但是尺寸有些奇怪.

>>> np.shape(x)
(5,)
Run Code Online (Sandbox Code Playgroud)

尺寸不是(5, 1),但确实如此(5, ).它究竟意味着什么?我不太清楚为什么这个元组的第二个元素是空的.

我检查了以下返回(5,1)

y = np.array([[1], [2], [3], [4], [5]]) 
np.shape(y)
(5, 1)
Run Code Online (Sandbox Code Playgroud)

然后,"y"和NumPy中的"x"相同吗?我认为不是.我可能会误解某些东西,但任何人都可以启发我这个话题吗?

谢谢!

arrays matlab numpy

2
推荐指数
1
解决办法
234
查看次数

ndarray.tofile的奇怪行为

我正在转向Matlab到NumPy/SciPy,似乎np.fromfile和ndarray.tofile分别在matlab中对fread和fwrite进行了修改.

为了测试这些API,我首先创建了一个二进制文件,其中包含五个整数{1,2,3,4,5},采用二进制'int32'格式.

然后,我使用np.fromfile读取此文件.

In [365]:

in_file = open('12345.bin', 'rb'); x = np.fromfile(in_file, 'int32'); in_file.close()
Run Code Online (Sandbox Code Playgroud)

我检查它已成功读取,如下所示:

In [367]:

x

Out[366]:
array([1, 2, 3, 4, 5], dtype=int32)
Run Code Online (Sandbox Code Playgroud)

现在,我将其写为具有不同名称的文件.我的期望是这个输出文件应该与原始输入文件完全相同,即'12345.bin'.

In [368]:


out_file = open('12345out.bin', 'wb'); x.tofile(out_file, 'int32'); out_file.close()
Run Code Online (Sandbox Code Playgroud)

但令人惊讶的是,'12345out.bin'的大小是25个字节,而'12345.bin'是20个字节.出了点问题.我打开'12345out.bin'如下:

In [369]:

in_file = open('12345out.bin', 'rb'); x2 = np.fromfile(in_file, 'int32'); in_file.close()

In [370]:

x2

Out[370]:
array([1953392945, 1764897331,  842232942, 1953392947, 1765028403,
        842232942], dtype=int32)
Run Code Online (Sandbox Code Playgroud)

因此,从上面的结果来看,我们发现某些事情是完全错误的.Coud有谁请帮助我,我做错了什么?

python matlab numpy scipy

2
推荐指数
1
解决办法
323
查看次数