1 Làm thế nào để tạo ra một lưới các vectơ 3D? (mỗi vị trí trong lưới 3D là một vectơ)

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi muốn tạo một mảng bốn chiều với các kích thước (mờ, N, N, N). Thành phần đầu tiên ndim = 3 và N tương ứng với chiều dài lưới. Làm thế nào một người có thể tạo ra một mảng như vậy bằng cách sử dụng python?

đây là cách triển khai 'xấu xí' của tôi:

qvec=np.zeros([ndim,N,N,N])  

freq   = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(freq[range(N)], freq[range(N)], freq[range(N)],indexing='ij')

qvec[0,:,:,:]=x
qvec[1,:,:,:]=y
qvec[2,:,:,:]=z
    
1
  1. Không giống tôi xấu xí . Tại sao bạn nghĩ vậy?
    2019-05-08 16: 08: 50Z
  2. @ kmario23 tôi không thích viết ba lần qvec. Tôi nghĩ có lẽ có một 'lớp lót' hoặc một chức năng khác có thể tạo ra điều này trực tiếp.
    2019-05-09 05: 47: 44Z
1 Câu trả lời                              1                         

Việc triển khai của bạn có vẻ đủ tốt với tôi. Tuy nhiên, đây là một số cải tiến để làm cho nó đẹp hơn:

qvec=np.empty([ndim,N,N,N])  

freq   = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(*[freq]*ndim, indexing='ij')

qvec[0,...]=x   # qvec[0] = x
qvec[1,...]=y   # qvec[1] = y
qvec[2,...]=z   # qvec[2] = z

Các cải tiến là:

  • Sử dụng numpy.empty() thay vì numpy.zeros()
  • Loại bỏ chỉ mục range(N) vì điều đó sẽ cho cùng một mảng freq
  • Sử dụng giải nén có thể lặp lại và sử dụng ndim
  • Sử dụng ký hiệu dấu chấm lửng cho kích thước (điều này cũng không cần thiết)

Vì vậy, sau khi kết hợp tất cả các điểm trên, đoạn mã dưới đây sẽ đủ:

qvec=np.empty([ndim,N,N,N])  
freq   = np.arange(-(N-1)/2.,+(N+1)/2.)
x, y, z = np.meshgrid(*[freq]*ndim, indexing='ij')    
qvec[0:ndim] = x, y, z

Lưu ý: Tôi giả sử N giống nhau vì bạn đã sử dụng cùng một tên biến.

    
0
2019-05-08 16: 29: 04Z
  1. cảm ơn bạn đã gợi ý. Nó trông khá đẹp ngay bây giờ :). Có N giống nhau.
    2019-05-09 05: 50: 30Z
  2. chính xác thì * [freq] * ndim hoạt động như thế nào? Tôi thường thấy * a ở phía bên trái nhưng không chắc cách thức hoạt động ở đây.
    2019-05-09 06: 30: 10Z
  3. [freq]*3 tương đương với [freq, freq, freq]. đó là những gì * cần. HTH :)
    2019-05-09 07: 49: 07Z
  4. ok. Bây giờ rõ ràng rồi. Cảm ơn bạn.
    2019-05-09 15: 01: 05Z
list
nguồn đặt đây