GVKun编程网logo

如何将 Numpy 数组的元素分配给对象另一个 Numpy 数组的指针?(numpy数组元素可以为不同类型)

1

如果您想了解如何将Numpy数组的元素分配给对象另一个Numpy数组的指针?的相关知识,那么本文是一篇不可错过的文章,我们将对numpy数组元素可以为不同类型进行全面详尽的解释,并且为您提供关于num

如果您想了解如何将 Numpy 数组的元素分配给对象另一个 Numpy 数组的指针?的相关知识,那么本文是一篇不可错过的文章,我们将对numpy数组元素可以为不同类型进行全面详尽的解释,并且为您提供关于numpy.random.random & numpy.ndarray.astype & numpy.arange、numpy.ravel()/numpy.flatten()/numpy.squeeze()、Numpy:数组创建 numpy.arrray() , numpy.arange()、np.linspace ()、数组基本属性、二维数组(解引用、指针数组、数组的指针)——C语言的有价值的信息。

本文目录一览:

如何将 Numpy 数组的元素分配给对象另一个 Numpy 数组的指针?(numpy数组元素可以为不同类型)

如何将 Numpy 数组的元素分配给对象另一个 Numpy 数组的指针?(numpy数组元素可以为不同类型)

如何解决如何将 Numpy 数组的元素分配给对象另一个 Numpy 数组的指针?

基本上,这就是我想要/期望的,

  1. import numpy as np
  2. x = np.empty(2,dtype=np.ndarray)
  3. y = np.empty(2,dtype=np.ndarray)
  4. x[0] = np.zeros((2,2))
  5. x[1] = np.zeros((2,3))
  6. y[0] = np.zeros((5,1))
  7. y[1] = np.zeros((5,2))
  8. xy = np.empty(2,dtype=np.ndarray)
  9. xy[0] = x # this does xy[0] = contents(x)
  10. xy[1] = y # i want xy[1] = pointer(y)
  11. xy = xy + 1 # such that when xy''s elements are mutated
  12. print(xy[0][0]) # we see the change here
  13. # [[1. 1.]
  14. # [1. 1.]]
  15. print(x[0]) # and here as desired,but we don''t see the change here
  16. # [[0. 0.]
  17. # [0. 0.]]

当我将 xy 的元素分配给另一个 Numpy 数组 xy 时,我希望将指向 xy 的指针分配给 { {1}} 这样当 xy[i] 的元素被改变时,我们应该看到原始数组 xyx 的变化。这可能吗?

numpy.random.random & numpy.ndarray.astype & numpy.arange

numpy.random.random & numpy.ndarray.astype & numpy.arange

今天看到这样一句代码:

xb = np.random.random((nb, d)).astype(''float32'') #创建一个二维随机数矩阵(nb行d列)
xb[:, 0] += np.arange(nb) / 1000. #将矩阵第一列的每个数加上一个值

要理解这两句代码需要理解三个函数

1、生成随机数

numpy.random.random(size=None) 

size为None时,返回float。

size不为None时,返回numpy.ndarray。例如numpy.random.random((1,2)),返回1行2列的numpy数组

 

2、对numpy数组中每一个元素进行类型转换

numpy.ndarray.astype(dtype)

返回numpy.ndarray。例如 numpy.array([1, 2, 2.5]).astype(int),返回numpy数组 [1, 2, 2]

 

3、获取等差数列

numpy.arange([start,]stop,[step,]dtype=None)

功能类似python中自带的range()和numpy中的numpy.linspace

返回numpy数组。例如numpy.arange(3),返回numpy数组[0, 1, 2]

numpy.ravel()/numpy.flatten()/numpy.squeeze()

numpy.ravel()/numpy.flatten()/numpy.squeeze()

numpy.ravel(a, order=''C'')

  Return a flattened array

numpy.chararray.flatten(order=''C'')

  Return a copy of the array collapsed into one dimension

numpy.squeeze(a, axis=None)

  Remove single-dimensional entries from the shape of an array.

 

相同点: 将多维数组 降为 一维数组

不同点:

  ravel() 返回的是视图(view),意味着改变元素的值会影响原始数组元素的值;

  flatten() 返回的是拷贝,意味着改变元素的值不会影响原始数组;

  squeeze()返回的是视图(view),仅仅是将shape中dimension为1的维度去掉;

 

ravel()示例:

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10     
11 a = np.floor(10*np.random.random((3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.ravel()
16 print("a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 
20 print(a)
21 log_type(''a'',a)

 

flatten()示例

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10     
11 a = np.floor(10*np.random.random((3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.flatten()
16 print("修改前a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 print("修改后a1:{}".format(a1))
20 
21 print("a:{}".format(a))
22 log_type(''a'',a)

 

squeeze()示例:

1. 没有single-dimensional entries的情况

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10     
11 a = np.floor(10*np.random.random((3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.squeeze()
16 print("修改前a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 print("修改后a1:{}".format(a1))
20 
21 print("a:{}".format(a))
22 log_type(''a'',a)

从结果中可以看到,当没有single-dimensional entries时,squeeze()返回额数组对象是一个view,而不是copy。

 

2. 有single-dimentional entries 的情况

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 
 4 def log_type(name,arr):
 5     print("数组{}的大小:{}".format(name,arr.size))
 6     print("数组{}的维度:{}".format(name,arr.shape))
 7     print("数组{}的维度:{}".format(name,arr.ndim))
 8     print("数组{}元素的数据类型:{}".format(name,arr.dtype))
 9     #print("数组:{}".format(arr.data))
10 
11 a = np.floor(10*np.random.random((1,3,4)))
12 print(a)
13 log_type(''a'',a)
14 
15 a1 = a.squeeze()
16 print("修改前a1:{}".format(a1))
17 log_type(''a1'',a1)
18 a1[2] = 100
19 print("修改后a1:{}".format(a1))
20 
21 print("a:{}".format(a))
22 log_type(''a'',a)

 

Numpy:数组创建 numpy.arrray() , numpy.arange()、np.linspace ()、数组基本属性

Numpy:数组创建 numpy.arrray() , numpy.arange()、np.linspace ()、数组基本属性

一、Numpy数组创建

 part 1:np.linspace(起始值,终止值,元素总个数

 

import numpy as np
''''''
numpy中的ndarray数组
''''''

ary = np.array([1, 2, 3, 4, 5])
print(ary)
ary = ary * 10
print(ary)

''''''
ndarray对象的创建
''''''
# 创建二维数组
# np.array([[],[],...])
a = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(a)

# np.arange(起始值, 结束值, 步长(默认1))
b = np.arange(1, 10, 1)
print(b)

print("-------------np.zeros(数组元素个数, dtype=''数组元素类型'')-----")
# 创建一维数组:
c = np.zeros(10)
print(c, ''; c.dtype:'', c.dtype)

# 创建二维数组:
print(np.zeros ((3,4)))

print("----------np.ones(数组元素个数, dtype=''数组元素类型'')--------")
# 创建一维数组:
d = np.ones(10, dtype=''int64'')
print(d, ''; d.dtype:'', d.dtype)

# 创建三维数组:
print(np.ones( (2,3,4), dtype=np.int32 ))
# 打印维度
print(np.ones( (2,3,4), dtype=np.int32 ).ndim)  # 返回:3(维)

 

结果图:

 

part 2 :np.linspace ( 起始值,终止值,元素总个数)

 

import numpy as np
a = np.arange( 10, 30, 5 )

b = np.arange( 0, 2, 0.3 )

c = np.arange(12).reshape(4,3)

d = np.random.random((2,3))  # 取-1到1之间的随机数,要求设置为诶2行3列的结构

print(a)
print(b)
print(c)
print(d)

print("-----------------")
from numpy import pi
print(np.linspace( 0, 2*pi, 100 ))

print("-------------np.linspace(起始值,终止值,元素总个数)------------------")
print(np.sin(np.linspace( 0, 2*pi, 100 )))

 

结果图:

 

 

 

 

二、Numpy的ndarray对象属性:

数组的结构:array.shape

数组的维度:array.ndim

元素的类型:array.dtype

数组元素的个数:array.size

数组的索引(下标):array[0]

 

''''''
数组的基本属性
''''''
import numpy as np

print("--------------------案例1:------------------------------")
a = np.arange(15).reshape(3, 5)
print(a)
print(a.shape)     # 打印数组结构
print(len(a))      # 打印有多少行
print(a.ndim)     # 打印维度
print(a.dtype)    # 打印a数组内的元素的数据类型
# print(a.dtype.name)
print(a.size)    # 打印数组的总元素个数


print("-------------------案例2:---------------------------")
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)

# 测试数组的基本属性
print(''a.shape:'', a.shape)
print(''a.size:'', a.size)
print(''len(a):'', len(a))
# a.shape = (6, )  # 此格式可将原数组结构变成1行6列的数据结构
# print(a, ''a.shape:'', a.shape)

# 数组元素的索引
ary = np.arange(1, 28)
ary.shape = (3, 3, 3)   # 创建三维数组
print("ary.shape:",ary.shape,"\n",ary )

print("-----------------")
print(''ary[0]:'', ary[0])
print(''ary[0][0]:'', ary[0][0])
print(''ary[0][0][0]:'', ary[0][0][0])
print(''ary[0,0,0]:'', ary[0, 0, 0])

print("-----------------")


# 遍历三维数组:遍历出数组里的每个元素
for i in range(ary.shape[0]):
    for j in range(ary.shape[1]):
        for k in range(ary.shape[2]):
            print(ary[i, j, k], end='' '')
            

 

结果图:

 

二维数组(解引用、指针数组、数组的指针)——C语言

二维数组(解引用、指针数组、数组的指针)——C语言

二维数组

在说二维数组前先来说下一维数组中的指针数组和和数组的指针

一、一维数组中指针数组数组指针的区别

指针数组:

1 int *p[5];

[]的优先级比*高,首先它是一个数组,它的大小是5,它里面存放的数据类型是int *,也就是整型指针。 所以它叫指针数组,讲到底这个p是一个数组,数组内的元素是5个指针,而数组内的每一个指针指向一个int型的变量

数组的指针:

int (*p)[5];

 首先p是一个指针,指向大小为5的数组,因此这叫数组的指针,定义了一个指向5个元素的一维数组的指针。(括号优先)

二、两者在赋值时的区别

指针数组的赋值

 1 #include <stdio.h>
 2 
 3 main()
 4 {
 5     int *p[5];
 6     int a = 10;
 7     
 8     p[0] = &a;
 9     printf("%d", *p[0]);
10 }

 

数组的指针的赋值

1 main()
2 {
3     int (*p)[5];
4     int a[5] = {1, 2, 3, 4, 5};
5 
6     p = &a;
7     printf("%d", *p[0]);
8 }

 

三、关于数组的地址(这里只讨论一维\二维数组)

一维数组

1 int a[5];

a表示的是数组的首地址,a等价于&a[0]

 

二维数组

1 int a[2][2] = {1, 2, 3, 4};

a表示的整个数组的首地址,a[0]表示的是第一行的首地址,这两者者在数值上是一样的,但含义不同(或者说类型不同),数组名a是对于整个数组,a[0]是对于第一行

 

对二者(a、a[0])的地址是否相同进行验证

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a[2][2] = {1, 2, 3, 4};
 6 
 7     printf("%p\n%p\n", a, a[0]);
 8 
 9     return 0;
10 }

运行结果

 

在用数组的地址进行赋值的时候,虽然三者值相同,但是三者不可随意混用(以int a[2][2]为例)

a--------是int (*)[2]型

a[0]-----是int *型

 

对于a[0]和&a[0][0],两个类型都是int *型的,所以下述两种赋值方法等价

第一种:

1 int a[2][2] = {1, 2, 3, 4};
2 int *p;
3 p = a[0];

第二种:

1 int a[2][2] = {1, 2, 3, 4};
2 int *p;
3 p = &a[0][0];

 对于int a[2][2]来说,如果将a[0]改为&a[0],那么&a[0]和a的类型相同,都为int (*)[2]类型,下面以int a[5][5]为例,列出了二维数组的元素在不同方式表达下的不同类型

也可以用一维指针数组来保存二维数组中某个元素的地址

1 int a[2][2] = {1, 2, 3, 4};
2 int *p[2];
3 p[0] = &a[0][0];
4 printf("%d", *p[0]);

 

四、二维数组的解引用

以二维数组a[2][3]={1, 2, 3, 4 ,5, 6};为例(第一维是行,第二维是列)

第一种:*(*a+1)--------等价于a[0][1],因为*的优先级比+高,所以先解引用,进入第二维在第二维里面地址+1,再次解引用得到元素值

第二种:*(*(a+1))------等价于a[1][0],比上面第一种多加了一个括号,括号优先级最高,先+1移动地址(注意是在第一维里面移动),然后解引用进入第二维,再解引用得到元素的值

第三种:*(&a[0][0]+1)--等价于a[0][1],这里使用了&取地址符,将原本表示第一个元素的a[0][0]返回到第二个维度,然后第二维地址+1,再解引用得到元素的值

 

为方便读者理解下面上图

 

补充:

请读者先看下面的代码

1 #include <stdio.h>
2 
3 main()
4 {
5     int a[2][3] = {1, 2, 3, 4, 5, 6};
6 
7     printf("%d***%d", *(a[1]+1), (*a+1)[1]);
8 }

 *(a[1]+1)--------表示的是a[1][1]的值

(*a+1)[1]--------表示的是a[0][2]的值

为了方便描述先退回一维数组,以int a[5]来说,a表示的数组a的首地址,a[2]表示在a的基础上移动2个地址(注意a的类型是int *型的,再解引用得到元素的值,意思是a[2]

实际上包含了两步,第一步地址移动,第二步解引用得到元素的值(注意第二步,有点隐式转换的意思,经常被人忽略)

现在来解释上面的二维数组就容易多了

先来看第一个*(a[1]+1),a[1]代表第二行的首地址,注意这里的维度已经是第二维度了,然后括号优先第二维地址+1,最后解引用得到元素的值

 

来看第二个(*a+1)[1],这里提一句,因为[]的优先级是比*高的所以这里的括号不能去掉,第一步先解引用进入第二维度(*优先级高于+),然后第二维地址+1,然后再在当前基础上再移动一次地址,最后解引用

得到元素的值,这里可能有点绕,换个说法就是[1]是在当前维度进行移动,然后解引用(“当前维度”有点不太严谨,为了方便理解先将就这么用了)

 

拿a[2][1]来说,一共有四步,其中包含了两次地址移动,两次解引用,执行顺序是:地址移动->解引用->地址移动->解引用(这里提一句,[]的结合性是左结合的,所以在移动的时候先移动行(第一维)再移动列(第二维),小声BB

详细步骤:第一步:在当前维度地址+2,因为a的维度是第一维,所以是第一维地址+2,即行+2

     第二步:解引用进入第二维度

     第三步:在当前维度地址+1,因为这时已经进入第二维,所以第二维地址+1,即列+1

     第四步:解引用得到元素的值  

 

今天关于如何将 Numpy 数组的元素分配给对象另一个 Numpy 数组的指针?numpy数组元素可以为不同类型的讲解已经结束,谢谢您的阅读,如果想了解更多关于numpy.random.random & numpy.ndarray.astype & numpy.arange、numpy.ravel()/numpy.flatten()/numpy.squeeze()、Numpy:数组创建 numpy.arrray() , numpy.arange()、np.linspace ()、数组基本属性、二维数组(解引用、指针数组、数组的指针)——C语言的相关知识,请在本站搜索。

本文标签: