{
  "source_file": "0930",
  "source_platform": "Dev.to",
  "author": "Vuk Rosić",
  "title_listed": "NumPy Essentials: Arrays and vectorization",
  "keywords": "",
  "domain": "机器学习",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://dev.to/vuk_rosic/numpy-essentials-arrays-and-vectorization-19id",
  "publish_date": "2025-07-06",
  "corpus_stage": "",
  "notes": "",
  "id": "b92f66fb462d",
  "collected_at": "2026-10-02T14:06:37",
  "title": "NumPy Essentials: Arrays and vectorization - DEV Community",
  "body_markdown": "NumPy Essentials: Arrays and Vectorization\nPart 1: Getting Started\nimport\nnumpy\nas\nnp\n# Create your first array\narr\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n,\n5\n])\nprint\n(\narr\n)\n# [1 2 3 4 5]\nEnter fullscreen mode\nExit fullscreen mode\nWhat happened\n: We converted a Python list into a NumPy array - the foundation of scientific computing.\nPart 2: Arrays vs Lists\n# Python list\npython_list\n=\n[\n1\n,\n2\n,\n3\n,\n4\n,\n5\n]\nprint\n(\ntype\n(\npython_list\n))\n# <class 'list'>\n# NumPy array\nnumpy_array\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n,\n5\n])\nprint\n(\ntype\n(\nnumpy_array\n))\n# <class 'numpy.ndarray'>\nEnter fullscreen mode\nExit fullscreen mode\nKey difference\n: Lists store objects, arrays store numbers - much faster for math!\nPart 3: Array Properties\narr\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n,\n5\n])\nprint\n(\narr\n.\nshape\n)\n# (5,) - 5 elements in 1 dimension\nprint\n(\narr\n.\nsize\n)\n# 5 - total number of elements\nprint\n(\narr\n.\ndtype\n)\n# int64 - data type\nEnter fullscreen mode\nExit fullscreen mode\nIntuition\n: Shape tells you the dimensions, size tells you total elements.\nPart 4: Creating Arrays\n# Zeros\nzeros\n=\nnp\n.\nzeros\n(\n5\n)\n# [0. 0. 0. 0. 0.]\n# Ones\nones\n=\nnp\n.\nones\n(\n3\n)\n# [1. 1. 1.]\n# Range\nrange_arr\n=\nnp\n.\narange\n(\n10\n)\n# [0 1 2 3 4 5 6 7 8 9]\n# Evenly spaced\nlinspace\n=\nnp\n.\nlinspace\n(\n0\n,\n1\n,\n5\n)\n# [0.   0.25 0.5  0.75 1.  ]\nEnter fullscreen mode\nExit fullscreen mode\nPractice\n: Create arrays filled with specific values or patterns.\nPart 5: 2D Arrays (Matrices)\n# Create a 2D array\nmatrix\n=\nnp\n.\narray\n([[\n1\n,\n2\n,\n3\n],\n[\n4\n,\n5\n,\n6\n]])\nprint\n(\nmatrix\n.\nshape\n)\n# (2, 3) - 2 rows, 3 columns\nprint\n(\nmatrix\n.\nsize\n)\n# 6 - total elements\nEnter fullscreen mode\nExit fullscreen mode\nVisualization\n: Think of it as a table with rows and columns.\nPart 6: Array Creation Shortcuts\n# 2D zeros\nzeros_2d\n=\nnp\n.\nzeros\n((\n3\n,\n4\n))\n# 3x4 matrix of zeros\n# Identity matrix\nidentity\n=\nnp\n.\neye\n(\n3\n)\n# 3x3 identity matrix\n# Random numbers\nrandom_arr\n=\nnp\n.\nrandom\n.\nrandom\n(\n5\n)\n# 5 random numbers [0,1)\nEnter fullscreen mode\nExit fullscreen mode\nUse cases\n: Initialize matrices for machine learning, create test data.\nPart 7: Array Indexing\narr\n=\nnp\n.\narray\n([\n10\n,\n20\n,\n30\n,\n40\n,\n50\n])\n# Single element\nprint\n(\narr\n[\n0\n])\n# 10 - first element\nprint\n(\narr\n[\n-\n1\n])\n# 50 - last element\n# Multiple elements\nprint\n(\narr\n[\n1\n:\n4\n])\n# [20 30 40] - slice notation\nEnter fullscreen mode\nExit fullscreen mode\nRule\n: Same as Python lists, but much faster for large arrays.\nPart 8: 2D Array Indexing\nmatrix\n=\nnp\n.\narray\n([[\n1\n,\n2\n,\n3\n],\n[\n4\n,\n5\n,\n6\n]])\n# Single element\nprint\n(\nmatrix\n[\n0\n,\n1\n])\n# 2 - row 0, column 1\n# Entire row\nprint\n(\nmatrix\n[\n1\n,\n:])\n# [4 5 6] - row 1, all columns\n# Entire column\nprint\n(\nmatrix\n[:,\n2\n])\n# [3 6] - all rows, column 2\nEnter fullscreen mode\nExit fullscreen mode\nSyntax\n:\n[row, column]\n- comma separates dimensions.\nPart 9: The Magic of Vectorization\n# Python way (slow)\npython_list\n=\n[\n1\n,\n2\n,\n3\n,\n4\n,\n5\n]\nresult\n=\n[]\nfor\nx\nin\npython_list\n:\nresult\n.\nappend\n(\nx\n*\n2\n)\n# NumPy way (fast)\nnumpy_array\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n,\n5\n])\nresult\n=\nnumpy_array\n*\n2\n# [2 4 6 8 10]\nEnter fullscreen mode\nExit fullscreen mode\nVectorization\n: Apply operations to entire arrays at once - no loops needed!\nPart 10: Element-wise Operations\na\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n])\nb\n=\nnp\n.\narray\n([\n4\n,\n5\n,\n6\n])\n# Basic operations\nprint\n(\na\n+\nb\n)\n# [5 7 9]   - addition\nprint\n(\na\n-\nb\n)\n# [-3 -3 -3] - subtraction\nprint\n(\na\n*\nb\n)\n# [4 10 18] - multiplication\nprint\n(\na\n/\nb\n)\n# [0.25 0.4 0.5] - division\nEnter fullscreen mode\nExit fullscreen mode\nKey insight\n: Operations happen element-by-element automatically.\nPart 11: Broadcasting\n# Array and scalar\narr\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n])\nresult\n=\narr\n+\n10\n# [11 12 13 14]\n# Different shapes\na\n=\nnp\n.\narray\n([[\n1\n,\n2\n,\n3\n]])\n# 1x3\nb\n=\nnp\n.\narray\n([[\n10\n],\n[\n20\n]])\n# 2x1\nresult\n=\na\n+\nb\n# 2x3 result\nEnter fullscreen mode\nExit fullscreen mode\nBroadcasting\n: NumPy automatically expands arrays to compatible shapes.\nPart 12: Mathematical Functions\narr\n=\nnp\n.\narray\n([\n1\n,\n4\n,\n9\n,\n16\n])\n# Common functions\nprint\n(\nnp\n.\nsqrt\n(\narr\n))\n# [1. 2. 3. 4.] - square root\nprint\n(\nnp\n.\nlog\n(\narr\n))\n# natural logarithm\nprint\n(\nnp\n.\nexp\n(\narr\n))\n# exponential\nprint\n(\nnp\n.\nsin\n(\narr\n))\n# sine\nEnter fullscreen mode\nExit fullscreen mode\nAdvantage\n: All functions work element-wise across entire arrays.\nPart 13: Array Statistics\ndata\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n,\n5\n,\n6\n,\n7\n,\n8\n,\n9\n,\n10\n])\n# Basic statistics\nprint\n(\nnp\n.\nmean\n(\ndata\n))\n# 5.5 - average\nprint\n(\nnp\n.\nmedian\n(\ndata\n))\n# 5.5 - middle value\nprint\n(\nnp\n.\nstd\n(\ndata\n))\n# 2.87 - standard deviation\nprint\n(\nnp\n.\nsum\n(\ndata\n))\n# 55 - total\nEnter fullscreen mode\nExit fullscreen mode\nUse case\n: Quick analysis of datasets without writing loops.\nPart 14: Array Reshaping\narr\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n,\n5\n,\n6\n])\n# Reshape to 2x3\nreshaped\n=\narr\n.\nreshape\n(\n2\n,\n3\n)\nprint\n(\nreshaped\n)\n# [[1 2 3]\n#  [4 5 6]]\n# Flatten back to 1D\nflat\n=\nreshaped\n.\nflatten\n()\n# [1 2 3 4 5 6]\nEnter fullscreen mode\nExit fullscreen mode\nRule\n: Total elements must stay the same (2×3 = 6 elements).\nPart 15: Boolean Indexing\ndata\n=\nnp\n.\narray\n([\n1\n,\n5\n,\n3\n,\n8\n,\n2\n,\n9\n])\n# Create boolean mask\nmask\n=\ndata\n>\n4\n# [False True False True False True]\n# Filter data\nfiltered\n=\ndata\n[\nmask\n]\n# [5 8 9]\n# One-liner\nbig_numbers\n=\ndata\n[\ndata\n>\n4\n]\n# [5 8 9]\nEnter fullscreen mode\nExit fullscreen mode\nPower\n: Select elements based on conditions without loops.\nPart 16: Array Concatenation\na\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n])\nb\n=\nnp\n.\narray\n([\n4\n,\n5\n,\n6\n])\n# Concatenate\ncombined\n=\nnp\n.\nconcatenate\n([\na\n,\nb\n])\n# [1 2 3 4 5 6]\n# Stack vertically\nstacked\n=\nnp\n.\nvstack\n([\na\n,\nb\n])\n# [[1 2 3]\n#  [4 5 6]]\nEnter fullscreen mode\nExit fullscreen mode\nUse case\n: Combine datasets or results from different computations.\nPart 17: Matrix Operations\n# Matrix multiplication\nA\n=\nnp\n.\narray\n([[\n1\n,\n2\n],\n[\n3\n,\n4\n]])\nB\n=\nnp\n.\narray\n([[\n5\n,\n6\n],\n[\n7\n,\n8\n]])\n# Element-wise multiplication\nelement_wise\n=\nA\n*\nB\n# [[5 12] [21 32]]\n# Matrix multiplication\nmatrix_mult\n=\nA\n@\nB\n# [[19 22] [43 50]]\nEnter fullscreen mode\nExit fullscreen mode\nDifference\n:\n*\nis element-wise,\n@\nis true matrix multiplication.\nPart 18: Performance Comparison\nimport\ntime\n# Large arrays\nsize\n=\n1000000\na\n=\nnp\n.\nrandom\n.\nrandom\n(\nsize\n)\nb\n=\nnp\n.\nrandom\n.\nrandom\n(\nsize\n)\n# Time NumPy\nstart\n=\ntime\n.\ntime\n()\nresult\n=\na\n+\nb\nnumpy_time\n=\ntime\n.\ntime\n()\n-\nstart\nprint\n(\nf\n\"\nNumPy time:\n{\nnumpy_time\n:\n.\n4\nf\n}\nseconds\n\"\n)\n# Typically 100x faster than pure Python!\nEnter fullscreen mode\nExit fullscreen mode\nWhy faster\n: NumPy uses optimized C code under the hood.\nPart 19: Common Patterns\n# Generate data\nx\n=\nnp\n.\nlinspace\n(\n0\n,\n10\n,\n100\n)\n# 100 points from 0 to 10\ny\n=\nnp\n.\nsin\n(\nx\n)\n# Sine wave\n# Find peaks\npeaks\n=\ny\n[\ny\n>\n0.9\n]\n# Normalize data\nnormalized\n=\n(\ny\n-\nnp\n.\nmean\n(\ny\n))\n/\nnp\n.\nstd\n(\ny\n)\nEnter fullscreen mode\nExit fullscreen mode\nReal-world\n: Data generation, filtering, and preprocessing.\nPart 20: Advanced Indexing\narr\n=\nnp\n.\narray\n([[\n1\n,\n2\n,\n3\n],\n[\n4\n,\n5\n,\n6\n],\n[\n7\n,\n8\n,\n9\n]])\n# Fancy indexing\nrows\n=\n[\n0\n,\n2\n]\ncols\n=\n[\n1\n,\n2\n]\nresult\n=\narr\n[\nrows\n,\ncols\n]\n# [2 9] - elements at (0,1) and (2,2)\n# Boolean indexing with conditions\nmask\n=\n(\narr\n>\n3\n)\n&\n(\narr\n<\n8\n)\n# Multiple conditions\nfiltered\n=\narr\n[\nmask\n]\n# [4 5 6 7]\nEnter fullscreen mode\nExit fullscreen mode\nPower\n: Extract complex patterns from data with simple syntax.\nPart 21: Array Sorting\ndata\n=\nnp\n.\narray\n([\n3\n,\n1\n,\n4\n,\n1\n,\n5\n,\n9\n,\n2\n,\n6\n])\n# Sort array\nsorted_data\n=\nnp\n.\nsort\n(\ndata\n)\n# [1 1 2 3 4 5 6 9]\n# Get sort indices\nindices\n=\nnp\n.\nargsort\n(\ndata\n)\n# [1 3 6 0 2 7 4 8]\n# Sort 2D array\nmatrix\n=\nnp\n.\narray\n([[\n3\n,\n1\n],\n[\n4\n,\n2\n]])\nsorted_matrix\n=\nnp\n.\nsort\n(\nmatrix\n,\naxis\n=\n1\n)\n# Sort each row\nEnter fullscreen mode\nExit fullscreen mode\nUse case\n: Order data for analysis or find top/bottom values.\nPart 22: Working with NaN\ndata\n=\nnp\n.\narray\n([\n1\n,\n2\n,\nnp\n.\nnan\n,\n4\n,\n5\n])\n# Check for NaN\nhas_nan\n=\nnp\n.\nisnan\n(\ndata\n)\n# [False False True False False]\n# Remove NaN\nclean_data\n=\ndata\n[\n~\nnp\n.\nisnan\n(\ndata\n)]\n# [1. 2. 4. 5.]\n# NaN-aware functions\nmean_ignore_nan\n=\nnp\n.\nnanmean\n(\ndata\n)\n# 3.0\nEnter fullscreen mode\nExit fullscreen mode\nReal data\n: Often contains missing values - NumPy handles them gracefully.\nPart 23: Array Memory and Views\narr\n=\nnp\n.\narray\n([\n1\n,\n2\n,\n3\n,\n4\n,\n5\n])\n# Slicing creates a view (shares memory)\nview\n=\narr\n[\n1\n:\n4\n]\nview\n[\n0\n]\n=\n999\nprint\n(\narr\n)\n# [1 999 3 4 5] - original changed!\n# Copy creates new array\ncopy\n=\narr\n.\ncopy\n()\ncopy\n[\n0\n]\n=\n777\nprint\n(\narr\n)\n# [1 999 3 4 5] - original unchanged\nEnter fullscreen mode\nExit fullscreen mode\nMemory efficiency\n: Views save memory, copies ensure independence.\nPart 24: Practical Example - Data Analysis\n# Simulate temperature data\ndays\n=\n30\ntemperatures\n=\nnp\n.\nrandom\n.\nnormal\n(\n25\n,\n5\n,\ndays\n)\n# Mean 25°C, std 5°C\n# Analysis\navg_temp\n=\nnp\n.\nmean\n(\ntemperatures\n)\nhot_days\n=\nnp\n.\nsum\n(\ntemperatures\n>\n30\n)\ncold_days\n=\nnp\n.\nsum\n(\ntemperatures\n<\n20\n)\ntemp_range\n=\nnp\n.\nmax\n(\ntemperatures\n)\n-\nnp\n.\nmin\n(\ntemperatures\n)\nprint\n(\nf\n\"\nAverage:\n{\navg_temp\n:\n.\n1\nf\n}\n°C\n\"\n)\nprint\n(\nf\n\"\nHot days (>30°C):\n{\nhot_days\n}\n\"\n)\nprint\n(\nf\n\"\nCold days (<20°C):\n{\ncold_days\n}\n\"\n)\nprint\n(\nf\n\"\nTemperature range:\n{\ntemp_range\n:\n.\n1\nf\n}\n°C\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nReal application\n: Weather data analysis with just a few lines.\nPart 25: Image Processing Example\n# Create a simple \"image\" (2D array)\nimage\n=\nnp\n.\nrandom\n.\nrandint\n(\n0\n,\n256\n,\n(\n100\n,\n100\n))\n# 100x100 grayscale\n# Basic operations\nbright_image\n=\nimage\n+\n50\n# Brighten\ndark_image\n=\nimage\n*\n0.5\n# Darken\nthreshold\n=\nimage\n>\n128\n# Binary threshold\n# Image statistics\nprint\n(\nf\n\"\nAverage brightness:\n{\nnp\n.\nmean\n(\nimage\n)\n:\n.\n1\nf\n}\n\"\n)\nprint\n(\nf\n\"\nBright pixels:\n{\nnp\n.\nsum\n(\nimage\n>\n200\n)\n}\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nApplication\n: Images are just arrays of numbers - perfect for NumPy.\nPart 26: Scientific Computing\n# Simulate a simple physics problem\ntime\n=\nnp\n.\nlinspace\n(\n0\n,\n10\n,\n1000\n)\n# Time from 0 to 10 seconds\ngravity\n=\n9.81\n# m/s²\ninitial_velocity\n=\n50\n# m/s\n# Calculate position (physics equation)\nposition\n=\ninitial_velocity\n*\ntime\n-\n0.5\n*\ngravity\n*\ntime\n**\n2\n# Find maximum height\nmax_height\n=\nnp\n.\nmax\n(\nposition\n)\nmax_time\n=\ntime\n[\nnp\n.\nargmax\n(\nposition\n)]\nprint\n(\nf\n\"\nMaximum height:\n{\nmax_height\n:\n.\n1\nf\n}\nm at\n{\nmax_time\n:\n.\n1\nf\n}\ns\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nPower\n: Solve complex scientific problems with vectorized operations.\nPart 27: Performance Tips\n# Avoid Python loops\n# BAD:\nresult\n=\n[]\nfor\nx\nin\nlarge_array\n:\nresult\n.\nappend\n(\nx\n**\n2\n)\n# GOOD:\nresult\n=\nlarge_array\n**\n2\n# Use built-in functions\n# BAD:\ntotal\n=\n0\nfor\nx\nin\nlarge_array\n:\ntotal\n+=\nx\n# GOOD:\ntotal\n=\nnp\n.\nsum\n(\nlarge_array\n)\nEnter fullscreen mode\nExit fullscreen mode\nGolden rule\n: If you're writing a loop, there's probably a NumPy function for it.\nPart 28: Common Mistakes\n# Mistake 1: Creating arrays in loops\n# BAD:\narr\n=\nnp\n.\narray\n([])\nfor\ni\nin\nrange\n(\n1000\n):\narr\n=\nnp\n.\nappend\n(\narr\n,\ni\n)\n# Slow!\n# GOOD:\narr\n=\nnp\n.\narange\n(\n1000\n)\n# Fast!\n# Mistake 2: Not using vectorization\n# BAD:\nresult\n=\nnp\n.\nzeros\n(\nlen\n(\narr\n))\nfor\ni\nin\nrange\n(\nlen\n(\narr\n)):\nresult\n[\ni\n]\n=\narr\n[\ni\n]\n*\n2\n# GOOD:\nresult\n=\narr\n*\n2\nEnter fullscreen mode\nExit fullscreen mode\nEfficiency\n: Pre-allocate arrays and use vectorized operations.\nPart 29: Next Steps\n# What you can do with NumPy:\n# 1. Data analysis (pandas builds on NumPy)\n# 2. Machine learning (scikit-learn uses NumPy)\n# 3. Image processing (OpenCV, PIL)\n# 4. Scientific computing (SciPy)\n# 5. Deep learning (TensorFlow, PyTorch)\n# Example: Linear regression in one line\nX\n=\nnp\n.\nrandom\n.\nrandom\n((\n100\n,\n2\n))\ny\n=\nnp\n.\nrandom\n.\nrandom\n(\n100\n)\nweights\n=\nnp\n.\nlinalg\n.\nlstsq\n(\nX\n,\ny\n,\nrcond\n=\nNone\n)[\n0\n]\nEnter fullscreen mode\nExit fullscreen mode\nFoundation\n: NumPy is the base for the entire Python scientific ecosystem.\nKey Takeaways\nArrays > Lists\n: Faster, more memory efficient for numerical data\nVectorization\n: Apply operations to entire arrays at once\nBroadcasting\n: Automatically handle different array shapes\nBoolean indexing\n: Filter data with conditions\nNo loops\n: NumPy functions are optimized - use them!\nShape matters\n: Understanding dimensions is crucial\nMemory views\n: Slicing shares memory, copying creates new arrays\nPractice Challenge\n# Create a 10x10 matrix of random numbers\n# Find all numbers greater than 0.5\n# Calculate their average\n# Replace numbers less than 0.3 with 0\nmatrix\n=\nnp\n.\nrandom\n.\nrandom\n((\n10\n,\n10\n))\nmask\n=\nmatrix\n>\n0.5\nhigh_values\n=\nmatrix\n[\nmask\n]\naverage\n=\nnp\n.\nmean\n(\nhigh_values\n)\nmatrix\n[\nmatrix\n<\n0.3\n]\n=\n0\nprint\n(\nf\n\"\nFound\n{\nlen\n(\nhigh_values\n)\n}\nvalues > 0.5\n\"\n)\nprint\n(\nf\n\"\nTheir average:\n{\naverage\n:\n.\n3\nf\n}\n\"\n)\nEnter fullscreen mode\nExit fullscreen mode\nMaster these concepts and you'll have a solid foundation for data science, machine learning, and scientific computing!",
  "metadata": {
    "title": "NumPy Essentials: Arrays and vectorization - DEV Community",
    "description": "NumPy Essentials: Arrays and Vectorization            Part 1: Getting Started      import...",
    "keywords": "software, coding, development, engineering, inclusive, community",
    "author": null,
    "og:type": "article",
    "og:url": "https://dev.to/vuk_rosic/numpy-essentials-arrays-and-vectorization-19id",
    "og:title": "NumPy Essentials: Arrays and vectorization",
    "og:description": "NumPy Essentials: Arrays and Vectorization            Part 1: Getting Started      import...",
    "og:site_name": "DEV Community",
    "og:image": "https://media2.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft85qa1rtop01ovyjrpv7.png",
    "twitter:site": "@thepracticaldev",
    "twitter:creator": "@VukRosic99",
    "twitter:title": "NumPy Essentials: Arrays and vectorization",
    "twitter:description": "NumPy Essentials: Arrays and Vectorization            Part 1: Getting Started      import...",
    "twitter:card": "summary_large_image",
    "twitter:widgets:new-embed-design": "on",
    "twitter:image:src": "https://media2.dev.to/dynamic/image/width=1000,height=500,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft85qa1rtop01ovyjrpv7.png"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "file": "attachments/b92f66fb462d/code/body-000.txt",
      "chars": 104,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-001.txt",
      "chars": 194,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-002.txt",
      "chars": 175,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-003.txt",
      "chars": 247,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-004.txt",
      "chars": 174,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-005.txt",
      "chars": 213,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-006.txt",
      "chars": 198,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-007.txt",
      "chars": 256,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-008.txt",
      "chars": 210,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-009.txt",
      "chars": 235,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-010.txt",
      "chars": 221,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-011.txt",
      "chars": 213,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-012.txt",
      "chars": 239,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-013.txt",
      "chars": 186,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-014.txt",
      "chars": 214,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-015.txt",
      "chars": 185,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-016.txt",
      "chars": 225,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-017.txt",
      "chars": 269,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-018.txt",
      "chars": 205,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-019.txt",
      "chars": 282,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-020.txt",
      "chars": 284,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-021.txt",
      "chars": 245,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-022.txt",
      "chars": 259,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-023.txt",
      "chars": 447,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-024.txt",
      "chars": 386,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-025.txt",
      "chars": 438,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-026.txt",
      "chars": 236,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-027.txt",
      "chars": 320,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-028.txt",
      "chars": 379,
      "language": "text"
    },
    {
      "file": "attachments/b92f66fb462d/code/body-029.txt",
      "chars": 371,
      "language": "text"
    }
  ],
  "images": [],
  "audio": [],
  "videos": [],
  "links": [],
  "repair_version": 2,
  "repaired_at": "2026-10-14T10:50:24Z",
  "source_url": "https://dev.to/vuk_rosic/numpy-essentials-arrays-and-vectorization-19id",
  "papers": [],
  "actual_video_files": [],
  "body_chars": 12805,
  "expected_body_images": 0,
  "discovery_status": "ok",
  "delivery_status": "ok",
  "missing_reason": "",
  "raw_html": "attachments/b92f66fb462d/pages/source.html",
  "local_html": "attachments/b92f66fb462d/pages/article.html",
  "body_base_path": "attachments/b92f66fb462d/pages/",
  "body_markdown_path": "attachments/b92f66fb462d/pages/article.md"
}